文章

使用 CMake CPack NSIS 打包 Qt 应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
if(WIN32 AND NOT UNIX)
    get_target_property(qmake_executable Qt6::qmake IMPORTED_LOCATION)
    get_filename_component(_qt_bin_dir "${qmake_executable}" DIRECTORY)
    find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")
    message(STATUS "Using windeployqt: ${WINDEPLOYQT_EXECUTABLE}")
    message(STATUS "qt bin dir: ${_qt_bin_dir}")
    add_custom_command(TARGET ${target_name} POST_BUILD
        COMMAND "${WINDEPLOYQT_EXECUTABLE}"
        $<$<CONFIG:Debug>:--debug>
        $<$<NOT:$<CONFIG:Debug>>:--release>
        --libdir $<TARGET_FILE_DIR:${target_name}>
        --verbose 0
        --compiler-runtime
        --no-opengl-sw
        --force
        --plugindir "$<TARGET_FILE_DIR:${target_name}>/plugins"
        $<TARGET_FILE:${target_name}>
        COMMENT "Deploying Qt..."
    )

    if(QT_VERSION_MAJOR EQUAL 6)
        qt_finalize_executable(${target_name})
    endif()

    include(GNUInstallDirs)
    install(PROGRAMS
        $<TARGET_FILE:${target_name}>
        DESTINATION . # TYPE BIN
    )

    install(DIRECTORY
        $<TARGET_FILE_DIR:${target_name}>/
        DESTINATION .
        FILES_MATCHING PATTERN "*.dll"
    )

    # CPack
    # InstallRequiredSystemLibraries 以及选项
    # https://cmake.org/cmake/help/latest/module/InstallRequiredSystemLibraries.html
    set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION TRUE)
    set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
    set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION ".")
    include(InstallRequiredSystemLibraries)

    set(CPACK_GENERATOR "IFW")
    set(CPACK_IFW_ROOT "D:/dev_libs/Qt/Tools/QtInstallerFramework/4.10")
    set(CPACK_PACKAGE_VERSION_MAJOR "1")
    set(CPACK_PACKAGE_VERSION_MINOR "0")

    # set human names to exetuables
    set(CPACK_PACKAGE_EXECUTABLES "${PROJECT_NAME}" "MAVLink Monitor installer")
    set(CPACK_CREATE_DESKTOP_LINKS "${PROJECT_NAME}")
endif()

include(CPACK)
include(CPackIFW)

编译完成之后,生成CPackConfig.cmake,在build目录下执行:

1
cpack.exe ./CPackConfig.cmake

参考

本文由作者按照 CC BY 4.0 进行授权