2025-11-07 如何基于CMake实现Qt应用的自动Deploy

1、前言

现在,Qt开发基本都是基于CMake,在QtCreator中可以很方便的build和run应用程序,但是我们如果在build后的文件夹里直接点击该应用程序,会因为缺少一些Dl而无法启动。一般我们会在终端,比如powershell或是cmd里运行windeployqt 去部署应用,但很麻烦。首先得找到windeployqt 所在的目录,再执行命令,如果每次发布都要这么做其实挺繁琐的。其实可以基于CMake自动进行这个过程。

2、内容

话不多说,直接上代码

# 检查是否是 Windows 平台
if(NOT WIN32)
    return()
endif()

get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION)
if(NOT _qmake_executable)
    message(WARNING "无法找到 qmake,部署可能会失败")
    return()
endif()

get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")

if(NOT WINDEPLOYQT_EXECUTABLE)
    message(WARNING "无法找到 windeployqt,部署可能会失败")
    return()
endif()

message(STATUS "正在为目标 ${PROJECT_NAME} 配置 Qt 部署...")

# 添加 Qt 部署命令
add_custom_command(
    TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND "${CMAKE_COMMAND}" -E echo "正在部署 Qt 依赖项..."
    COMMAND "${WINDEPLOYQT_EXECUTABLE}"
            --qmldir "${CMAKE_SOURCE_DIR}"
            --verbose 1
            --compiler-runtime
            "$<TARGET_FILE:${PROJECT_NAME}>"
    COMMENT "正在使用 windeployqt 部署 Qt 依赖..."
)

# 复制运行时依赖
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        $<TARGET_RUNTIME_DLLS:${PROJECT_NAME}>
        $<TARGET_FILE_DIR:${PROJECT_NAME}>
    COMMAND_EXPAND_LISTS
    COMMENT "复制运行时依赖"
)

其基本逻辑就是,通过_qmake_executable找到WINDEPLOYQT_EXECUTABLE, 利用add_custom_command添加在build完成后的自定义命令,在该命令中指定windeployqt并设置相应的参数。最关键的是,它还可以解决运行时的第三方依赖,这就方便我们不用手动一个个去复制了,有时候复制完了还得运行才知道缺少哪一个,循环的尝试,就挺麻烦的,这个方式完全避免了,非常方便!

Enjoy!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容