使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录
Posted
技术标签:
【中文标题】使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录【英文标题】:Copying Qt DLLs to executable directory on Windows using CMake 【发布时间】:2016-11-12 15:34:24 【问题描述】:CMake 新手,我很难理解如何使用生成器表达式。我正在尝试使用add_custom_command
创建一个构建后命令以将 Qt DLL 复制到可执行目录。
在Qt5WidgetsConfig.cmake
中,我可以看到它为 Qt5::Widgets 目标创建了不同的属性来引用 DLL,具体取决于当前活动的配置。 IMPORTED_LOCATION_DEBUG
或 IMPORTED_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)
【问题讨论】:
【参考方案1】:自己通过修改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
依赖于Gui
、Core
和qwindows.dll
等,您应该手动附加它们。 windeployqt
处理所有这些依赖关系。
这个脚本对我不起作用。 Visual Studio 报错评估表达式:目标“Qt6::Widgets”不是可执行文件或库。【参考方案2】:
您可以使用 windeployqt
程序,它是 Qt 二进制版本的一部分。它将扫描您的二进制文件并收集所有使用的 Qt DLL、插件和 QML 模块。它可以通过 add_custom_command(TARGET target_name POST_BUILD ...)
签名作为构建后事件包装在 CMake 中。
【讨论】:
这是正确的答案。 windeployqt 是 Qt 为 Qt 构建的一个简单有效的工具。这是[教程](youtube.com/watch?v=8qozxqSZQEg) 用法示例:***.com/a/60856725【参考方案3】:未来你可以将所有 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>
)
【讨论】:
以上是关于使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录的主要内容,如果未能解决你的问题,请参考以下文章
怎么将dll的文件复制替换到C:\windows\system32 win7
C++Qt5+win10+MSVC2015 64bit构建程序,Release编译成功后使用windeployqt.exe发布程序使用于win7出现缺少MSVCP140.dll!!!