Qt6在Windows 下使用CMake 安装时自动拷贝Qt及其他依赖文件

Qt6在Windows 下使用CMake 安装时自动拷贝Qt及其他依赖文件

Qt程序生成后,手动拷贝依赖文件是比较麻烦的事情,如何使用cmake自动查找并拷贝尤为重要。

脚本及操作如下:

  1. 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>)")
  1. 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()
]])
  1. 编译好后在build 目录中执行指令,即可安装完成
cmake --build . --target install --config Debug
  1. 完整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()
]])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值