Qt6在Windows 下使用CMake 安装时自动拷贝Qt及其他依赖文件
Qt程序生成后,手动拷贝依赖文件是比较麻烦的事情,如何使用cmake自动查找并拷贝尤为重要。
脚本及操作如下:
- Qt自带的windeployqt.exe部署工具,拷贝Qt太依赖的库及依赖文件到install 安装路径下
#获取windeployqt.exe 程序完整路径
get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
find_program(DEPLOYQT_EXECUTABLE NAMES windeployqt macdeployqt HINTS "${_qt_bin_dir}")
#调用windeployqt 拷贝(Qt)所有运行时依赖项部署到目标路径中去
install(CODE "execute_process(COMMAND
${DEPLOYQT_EXECUTABLE}
--verbose 0 --no-compiler-runtime
--dir ${CMAKE_INSTALL_PREFIX}/bin
$<TARGET_FILE:CMakeProject>)")
- file(GET_RUNTIME_DEPENDENCIES …)获取程序所依赖的其他库文件
install(CODE [[
file(GET_RUNTIME_DEPENDENCIES
RESOLVED_DEPENDENCIES_VAR RESOLVED_DEPS
UNRESOLVED_DEPENDENCIES_VAR UNRESOLVED_DEPS
EXECUTABLES $<TARGET_FILE:CMakeProject>
DIRECTORIES $<TARGET_FILE_DIR:Qt6::Widgets>
PRE_EXCLUDE_REGEXES "system32"
POST_EXCLUDE_REGEXES "system32"
)
foreach(DEP_LIB ${RESOLVED_DEPS})
file(INSTALL ${DEP_LIB} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
message("is copying dependencies:${DEP_LIB}")
endforeach()
]])
- 编译好后在build 目录中执行指令,即可安装完成
cmake --build . --target install --config Debug
- 完整CMakeLists
cmake_minimum_required(VERSION 3.5)
#表明在install 中可以使用生成器表达式
cmake_policy(SET CMP0087 NEW)
project(CMakeProject VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_INSTALL_PREFIX install)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
add_executable(CMakeProject
${PROJECT_SOURCES}
)
target_link_libraries(CMakeProject PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
set_target_properties(CMakeProject PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
install(TARGETS CMakeProject
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
#获取windeployqt.exe 程序完整路径
get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
find_program(DEPLOYQT_EXECUTABLE NAMES windeployqt macdeployqt HINTS "${_qt_bin_dir}")
#调用windeployqt 拷贝(Qt)所有运行时依赖项部署到目标路径中去
install(CODE "execute_process(COMMAND
${DEPLOYQT_EXECUTABLE}
--verbose 0 --no-compiler-runtime
--dir ${CMAKE_INSTALL_PREFIX}/bin
$<TARGET_FILE:CMakeProject>)")
#安装执行程序的依赖文件
#Windows需要指定查找目录,如果是包使用生成器表达式即可如:$<TARGET_FILE_DIR:Qt6::Widgets>
install(CODE [[
file(GET_RUNTIME_DEPENDENCIES
RESOLVED_DEPENDENCIES_VAR RESOLVED_DEPS
UNRESOLVED_DEPENDENCIES_VAR UNRESOLVED_DEPS
EXECUTABLES $<TARGET_FILE:CMakeProject>
DIRECTORIES $<TARGET_FILE_DIR:Qt6::Widgets>
PRE_EXCLUDE_REGEXES "system32"
POST_EXCLUDE_REGEXES "system32"
)
foreach(DEP_LIB ${RESOLVED_DEPS})
file(INSTALL ${DEP_LIB} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
message("is copying dependencies:${DEP_LIB}")
endforeach()
]])