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并设置相应的参数。最关键的是,它还可以解决运行时的第三方依赖,这就方便我们不用手动一个个去复制了,有时候复制完了还得运行才知道缺少哪一个,循环的尝试,就挺麻烦的,这个方式完全避免了,非常方便!