【问题标题】:Copying Qt DLLs to executable directory on Windows using CMake使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录
【发布时间】:2021-11-13 17:33:11
【问题描述】:

CMake 新手,我很难理解如何使用生成器表达式。我正在尝试使用add_custom_command 创建一个构建后命令以将 Qt DLL 复制到可执行目录。

Qt5WidgetsConfig.cmake 中,我可以看到它为 Qt5::Widgets 目标创建了不同的属性来引用 DLL,具体取决于当前活动的配置。 IMPORTED_LOCATION_DEBUGIMPORTED_LOCATION_RELEASE。我希望能够使用$<CONFIG:Debug> 生成器表达式作为if() 中的条件,但这不起作用。

我的 CMakeLists.txt:

# minimum version required for proper support of C++11 features in Qt
cmake_minimum_required(VERSION 3.1.0)

set(CMAKE_CONFIGURATION_TYPES Debug;Release)

# project name and version
project(TPBMon VERSION 0.0.0.1)

# Qt5 libs
find_package(Qt5Widgets REQUIRED)

# run Qt's MOC when needed
set(CMAKE_AUTOMOC ON)

add_executable(
    tpbmon
    src/main.cpp
    src/mainwindow.hpp
    src/mainwindow.cpp
)
target_link_libraries(tpbmon Qt5::Widgets)
set_target_properties(
    tpbmon
    PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin
)
if(WIN32)
    if($<CONFIG:Debug>)
        get_target_property(WIDGETDLL Qt5::Widgets IMPORTED_LOCATION_DEBUG)
    else($<CONFIG:Debug>)
        get_target_property(WIDGETDLL Qt5::Widgets IMPORTED_LOCATION_RELEASE)
    endif($<CONFIG:Debug>)
    add_custom_command(
        TARGET tpbmon POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy ${WIDGETDLL} $<TARGET_FILE_DIR:tpbmon>
    )
endif(WIN32)

【问题讨论】:

    标签: windows cmake qt5


    【解决方案1】:

    未来你可以将所有 Qt5 依赖项添加到你的可执行文件夹中:

     find_package(Qt5 COMPONENTS Core Gui Widgets)
     ...   
     add_custom_command(TARGET MyQtProj POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
            COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
            COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
            )
    

    【讨论】:

      【解决方案2】:

      您可以使用 windeployqt 程序,它是 Qt 二进制版本的一部分。它将扫描您的二进制文件并收集所有使用的 Qt DLL、插件和 QML 模块。它可以通过 add_custom_command(TARGET target_name POST_BUILD ...) 签名作为构建后事件包装在 CMake 中。

      【讨论】:

      • 这是正确的答案。 windeployqt 是 Qt 为 Qt 构建的一个简单有效的工具。这是[教程](youtube.com/watch?v=8qozxqSZQEg)
      【解决方案3】:

      自己通过修改add_custom_command 调用来解决

      add_custom_command(
          TARGET tpbmon POST_BUILD
          COMMAND ${CMAKE_COMMAND} -E copy_if_different
              $<TARGET_FILE:Qt5::Widgets>
              $<TARGET_FILE_DIR:tpbmon>
      )
      

      一夜好眠后的全新视角能带来多大的惊喜。 ;)

      【讨论】:

      • 好答案;但是Widgets 依赖于GuiCoreqwindows.dll 等,您应该手动附加它们。 windeployqt 处理所有这些依赖关系。
      猜你喜欢
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多