1、前言
現(xiàn)在,Qt開發(fā)基本都是基于CMake,在QtCreator中可以很方便的build和run應用程序,但是我們?nèi)绻赽uild后的文件夾里直接點擊該應用程序,會因為缺少一些Dl而無法啟動。一般我們會在終端,比如powershell或是cmd里運行windeployqt 去部署應用,但很麻煩。首先得找到windeployqt 所在的目錄,再執(zhí)行命令,如果每次發(fā)布都要這么做其實挺繁瑣的。其實可以基于CMake自動進行這個過程。
2、內(nèi)容
話不多說,直接上代碼
# 檢查是否是 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并設置相應的參數(shù)。最關鍵的是,它還可以解決運行時的第三方依賴,這就方便我們不用手動一個個去復制了,有時候復制完了還得運行才知道缺少哪一個,循環(huán)的嘗試,就挺麻煩的,這個方式完全避免了,非常方便!