使用CMake将Qt DLL复制到Windows上的可执行目录

Jeh*_*joa 3 windows cmake qt5

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

Qt5WidgetsConfig.cmake我可以看到它创建QT5 ::小工具的目标不同的属性来引用的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)
Run Code Online (Sandbox Code Playgroud)

jia*_*zhe 9

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

  • 用法示例:/sf/answers/4259970781/ (2认同)

Jeh*_*joa 8

通过修改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>
)
Run Code Online (Sandbox Code Playgroud)

这是一个令人惊奇的事情,一个良好的夜晚睡眠后可以做一个新的视角.;)

  • 好答案; 但是 `Widgets` 依赖于 `Gui`、`Core` 和 `qwindows.dll` 等,您应该手动附加它们。**`windeployqt`** 处理所有这些依赖项。 (2认同)