2025-11-07 如何基于CMake實現(xiàn)Qt應用的自動Deploy

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)的嘗試,就挺麻煩的,這個方式完全避免了,非常方便!

Enjoy!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容