使用cmake制作程序安装包

本文介绍了CMake 2.4.2之后的内置工具CPack,它可生成指定类型的安装包且能脱离CMake单独运行。文中详细说明了CPack的基本设置,包括包类型、版本、名称等,还介绍了语法、生成安装包命令,最后提及针对不同系统和安装包可设置相应变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cmake官方提供了CPack

 

一. 简介

CPack是CMake 2.4.2之后的一个内置工具,主要作用就是生成制定类型的安装包.它可以脱离cmake单独运行.

二. 基本设置 (mandatory)

  • 设置包类型
    set(CPACK_GENERATOR "DEB")  
    NOTE:参数可以是你所知道的任意压缩包类型,rpm,tar.gz等等,请参见官方wiki
  • 设置软件包版本
    set(CPACK_PACKAGE_VERSION "2.1") 
    NOTE:当然cpack还提供了CPACK_PACKAGE_VERSION_MAJOR;
    CPACK_PACKAGE_VERSION_MINOR;
    CPACK_PACKAGE_VERSION_PATCH,

    这三个合起来的功能和CPACK_PACKAGE_VERSION的作用是一样的
  • 设置软件包名称
    set(CPACK_PACKAGE_NAME "montecarlo")
  • 设置软件包装位置
    set(CPACK_SET_DESTDIR true)
    set(CPACK_INSTALL_PREFIX "/opt/montecarlo/")
  • 设置软件包生成的位置
    set(CPACK_OUTPUT_FILE_PREFIX  ${CMAKE_CURRENT_SOURCE_DIR})
  • 设置维护者信息
    set(CPACK_DEBIAN_PACKAGE_MAINTAINER "MonteCarlo……")
  • 设置描述文件
    #set(CPACK_PACKAGE_DESCRIPTION "description")
    set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "description")
    set(CPACK_PACKAGE_DESCRIPTION_SUMMARY, "description")
  • 设置安装包依赖约束关系
    set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc7 (>= 2.3.1-6) , libqt5dbus5")
  • 设置自动执行脚本(postinst、postrm、preinst、prerm等,这一项比较重要)
    set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/DEBIAN/postinst;${CMAKE_SOURCE_DIR}/DEBIAN/postrm;${CMAKE_SOURCE_DIR}/DEBIAN/preinst;${CMAKE_SOURCE_DIR}/DEBIAN/prerm;")
     
    基本上所有的安装包都会在安装之前或这安装之后执行一些操作,这就需要用到这个选项.
    总共有四种脚本:preinst(安装前执行), postinst(安装后执行), prerm(删除前执行), postrm(删除后执行)
    还要注意的就是这些脚本的权限问题,不要使用chmod u+x来赋权限,最好使用chmod 0777
  • 这一句放在CMakeLists.txt文件最后,不能少
    include(CPack)

三. 语法

在cpack中你要掌握的唯一语法就是install, 这个主要就是在制作安装包的过程中调用的

  • 目标文件

    install(TARGETS <targets>

            [[ARCHIVE|LIBRARY|RUNTIME]

             [DESTINATION <dir>]

             [PERMISSIONS <permissions>

             [Debug|Release..]]

             [COMPONENT <component>]

             [OPTIONAL]

            ][...])

     

    简单例子:

    INSTALL(TARGETS myrun mylib mystaticlib

         RUNTIME DESTINATION bin

         LIBRARY DESTINATION lib

         ARCHIVE DESTINATION libstatic

        )

    上面的例子会将:

    可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录

    动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录

    静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录

    特别注意的是你不需要关心 TARGETS 具体生成的路径,只需要写上 TARGETS 名称就可以了

  • 非目标文件的可执行程序(当然也可以是目标文件的可执行程序)

    INSTALL(PROGRAMS files... DESTINATION <dir>

    [PERMISSIONS permissions...]

    [CONFIGURATIONS [Debug|Release|...]]

    [COMPONENT <component>]

    [RENAME <name>] [OPTIONAL])

     

    简单例子:

    install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/control DESTINATION opt/montecarlo/bin)

    将control安装到/opt/montecarlo/bin下

  • 普通文件的安装:

    INSTALL(FILES files... DESTINATION <dir>

    [PERMISSIONS permissions...]

    [CONFIGURATIONS [Debug|Release|...]]

    [COMPONENT <component>]

    [RENAME <name>] [OPTIONAL])

  • 目录的安装:

    INSTALL(DIRECTORY dirs... DESTINATION <dir>

    [FILE_PERMISSIONS permissions...]

    [DIRECTORY_PERMISSIONS permissions...]

    [USE_SOURCE_PERMISSIONS]

    [CONFIGURATIONS [Debug|Release|...]]

    [COMPONENT <component>]

    [[PATTERN <pattern> | REGEX <regex>]

    [EXCLUDE] [PERMISSIONS permissions...]] [...])

     

    简单例子:

    install(DIRECTORY tool DESTINATION ${INSTALL_PATH}

            FILE_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE

                             GROUP_READ GROUP_EXECUTE

                             WORLD_READ WORLD_EXECUTE

        )

  • 在安装的时候执行一些shell命令

    install(CODE "EXECUTE_PROCESS(COMMAND cp -r /opt/montecarlo/lib ${CMAKE_SOURCE_DIR})")

    install(CODE "execute_process(COMMAND rm -rf ${CMAKE_SOURCE_DIR}/lib/.svn ${CMAKE_SOURCE_DIR}/lib/capture/.svn)")

四. 生成安装包命令

make package
基本上有了这些就可以制作出你自己的安装包了

五.附加

针对不同的系统及不同的安装包,还可以设置相应的变量,例如针对.deb安装包,可以设置

set (CPACK_RESOURCE_FILE_LICENSE"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")

#设置架构

set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")

#设置section

set(CPACK_DEBIAN_PACKAGE_SECTION "net")

#设置priority

set(CPACK_DEBIAN_PACKAGE_PRIORITY "Optional")

 

<think>好的,我需要帮用户解决在Ubuntu下使用Qt和CMake开发程序后的打问题。首先,用户的需求是将他们的应用程序打,以便于分发和部署。我需要考虑Qt程序打时常见的依赖问题,尤其是动态链接库的处理。 首先,我应该回忆一下Qt程序在Linux下的打方法。通常,直接编译后的可执行文件依赖系统的Qt库,如果目标机器没有安装相应版本的库,程序就无法运行。因此,打的关键在于含所有必要的依赖项。 用户使用的是CMake,这可能意味着他们的项目结构比较规范,但CMake本身并不处理打,所以需要借助其他工具。常见的工具有linuxdeployqt,这是一个将Qt程序打成AppImage的工具,或者生成含所有依赖的目录。这可能是主要的解决方案。 接下来,我需要分步骤说明如何使用linuxdeployqt。首先,用户需要确保程序已经编译成功,并且有一个可执行文件。然后下载linuxdeployqt,可能需要从GitHub获取。然后运行这个工具,指定可执行文件,它会自动收集所需的Qt库、插件和其他依赖项,生成一个AppImage或者含所有文件的目录。 另外,可能需要提到使用CMake的install命令来整理安装目录结构,方便打。比如设置安装路径,把头文件、可执行文件、资源文件等组织好,这样在打时可以直接处理这个安装目录。 还有,可能需要考虑其他打方式,比如制作DEB。这时候需要工具如dpkg-buildpackage或者CPack。用户如果希望生成DEB,可以配置CPack来简化流程。需要写一些CMake的配置,括设置信息、依赖等,然后运行CPack生成DEB文件。 另外,可能存在的注意事项,比如处理非Qt的依赖库,可能需要手动添加这些库到打目录中。或者使用ldd检查可执行文件的依赖,确保所有动态库都被含进去。 还有需要提到的是,测试打后的程序是否可以在其他机器上运行。用户可能需要一个没有安装开发环境的系统来测试,或者使用Docker容器进行验证。 总结一下,步骤大致如下: 1. 使用CMake构建项目,生成可执行文件。 2. 安装linuxdeployqt工具。 3. 运行linuxdeployqt处理可执行文件,生成AppImage或目录。 4. 或者配置CPack生成DEB。 5. 处理额外的依赖库。 6. 测试打结果。 需要注意的常见问题:Qt插件如平台插件(platforms)、图像格式插件(imageformats)等是否被正确打,否则程序可能无法启动。此外,确保翻译文件(qm)和资源文件也被含进去。 可能用户对步骤的具体命令不太清楚,所以需要给出示例命令,比如如何运行linuxdeployqt,如何配置CPack等。同时提醒环境变量可能需要设置,比如QT_PLUGIN_PATH等。 最后,检查是否有遗漏的步骤,比如调试符号的处理,或者是否需要剥离符号以减小体积,但用户可能更关注基本的打流程,这些高级步骤可以暂时不提,除非用户有特别需求。</think>在Ubuntu下使用Qt和CMake开发程序后,打需解决依赖和分发问题。以下是分步指南: --- ### **一、基础打方法(生成独立目录)** #### 1. 编译Release版本 ```bash mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j4 ``` #### 2. 安装linuxdeployqt工具 ```bash wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage chmod +x linuxdeployqt-continuous-x86_64.AppImage sudo mv linuxdeployqt-continuous-x86_64.AppImage /usr/local/bin/linuxdeployqt ``` #### 3. 收集依赖并打 假设可执行文件为`myapp`: ```bash # 创建打目录 mkdir -p pkg/usr/bin cp myapp pkg/usr/bin/ # 运行linuxdeployqt(自动复制Qt库和插件) linuxdeployqt pkg/usr/bin/myapp -appimage -always-overwrite # 生成独立目录(位于当前目录) mv pkg myapp_dir ``` --- ### **二、生成AppImage** #### 1. 添加.desktop文件 在`pkg/usr/share/applications`目录下创建`myapp.desktop`: ```ini [Desktop Entry] Name=MyApp Exec=myapp Icon=myapp-icon Type=Application Categories=Utility; ``` #### 2. 运行打命令 ```bash linuxdeployqt pkg/usr/bin/myapp -appimage ``` --- ### **三、使用CPack生成DEB** #### 1. 配置CMakeLists.txt 添加以下内容到`CMakeLists.txt`: ```cmake # 设置安装路径 install(TARGETS myapp DESTINATION bin) install(FILES myapp.desktop DESTINATION share/applications) install(FILES myapp.png DESTINATION share/icons/hicolor/48x48/apps) # 配置CPack set(CPACK_PACKAGE_NAME "myapp") set(CPACK_PACKAGE_VERSION "1.0.0") set(CPACK_PACKAGE_CONTACT "your-email@example.com") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5core5a, libqt5gui5, libqt5widgets5") include(CPack) ``` #### 2. 生成DEB ```bash cd build cpack -G DEB ``` --- ### **四、手动处理依赖** 若工具未自动含某些库: 1. 使用`ldd`检查依赖: ```bash ldd myapp | grep "not found" ``` 2. 手动复制缺失的库到打目录的`lib`子目录。 --- ### **注意事项** 1. **Qt插件**:确保`platforms`、`imageformats`等插件被复制到`plugins`目录。 2. **测试**:在纯净虚拟机或Docker中测试打结果。 3. **图标问题**:提供`.desktop`文件和图标,确保桌面环境正常显示。 --- 通过上述步骤,可生成独立运行的目录、AppImage或DEB安装包,适应不同分发需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值