1、CPack入门:什么是CPack、CPack在CMake生态中的角色、为什么需要CPack、CPack的工作流程概览

1.1 什么是CPack?

CPack,说白了就是CMake官方自带的打包工具。

你写完了代码,用CMake构建好了项目,生成了可执行文件、库文件。然后呢?怎么把这些东西发给用户?总不能让人家自己编译吧。

CPack就是干这个的。它能把你的构建产物打包成各种格式——Windows上的NSIS安装包、macOS上的DMG、Linux上的DEB或RPM、甚至跨平台的ZIP压缩包。

我个人习惯把CPack看作是CMake的「最后一公里」。没有它,你的项目就永远停留在开发阶段,没法真正交付。

一句话总结:CPack = CMake + Packaging。它让「构建」和「分发」无缝衔接。

1.2 CPack在CMake生态中的角色

CMake生态里主要有三个工具:CMake、CTest、CPack。它们各司其职:

工具 职责 我常用的场景
CMake 配置 + 构建 生成Makefile或Visual Studio工程
CTest 测试 跑单元测试、集成测试
CPack 打包 生成安装包、发布版本

CPack不是独立存在的。它依赖CMake的安装规则——你在CMakeLists.txt里用install()命令定义好「哪些文件要装到哪」,CPack就照着这个规则去打包。

嗯,这里要注意:没有install(),CPack就无从下手。我在项目中遇到过有人把install()写得乱七八糟,结果CPack打出来的包缺文件、路径不对……那叫一个头疼。

1.3 为什么需要CPack?

你可能会问:我自己写个脚本打包不行吗?

当然可以。但CPack有几个实实在在的好处:

  • 跨平台一致性:一套CMakeLists.txt,Windows、macOS、Linux都能打包。不用为每个平台单独写脚本。
  • 与CMake深度集成:install()规则写一次,构建和打包共用。少了很多重复劳动。
  • 支持多种包格式:DEB、RPM、NSIS、DMG、ZIP……覆盖了主流分发渠道。
  • 可定制性强:版本号、许可证、依赖关系、安装路径……都能在CMake里配好。

我曾经用Shell脚本打包一个跨平台项目,结果在macOS上路径分隔符搞错了,用户安装后直接报错。从那以后,我再也不敢手写打包脚本了。CPack虽然也有坑,但至少它把平台差异处理好了。

小提示:如果你的项目只需要一个简单的ZIP包,那用CPack可能有点「杀鸡用牛刀」。但一旦涉及多平台、多格式、依赖管理,CPack的价值就体现出来了。

1.4 CPack的工作流程概览

CPack的工作流程其实很简单,就三步:

  1. 配置:在CMakeLists.txt里定义好install()规则和CPack相关变量。
  2. 构建:用CMake生成构建系统,然后编译项目。
  3. 打包:运行cpack命令,生成安装包。

用流程图来看更清楚:

配置 install() CMakeLists.txt cmake --build 编译项目 cpack 生成安装包 三步走:配置 → 构建 → 打包

实际用起来,命令大概长这样:

# 第一步:配置
cmake -B build -DCMAKE_INSTALL_PREFIX=/usr/local

# 第二步:构建
cmake --build build

# 第三步:打包
cd build
cpack -G DEB          # 生成DEB包
cpack -G RPM          # 生成RPM包
cpack -G ZIP          # 生成ZIP压缩包

你想想看,就这么几行命令,就能生成不同平台的安装包。是不是挺省心的?

注意:CPack默认会读取CMakeCache.txt里的配置。如果你改了CMakeLists.txt,记得重新运行cmake配置,否则CPack用的还是旧规则。我曾经在这上面栽过跟头——改了安装路径,忘了重新配置,结果打出来的包路径全错了。

1.5 小结

CPack不是什么高深的东西。它就是CMake生态里负责「打包」的那个角色。你只要在CMakeLists.txt里写清楚安装规则,剩下的交给它就行。

从下一章开始,我们会一步步搭建一个完整的CPack项目。从最简单的ZIP包,到复杂的DEB/RPM包,再到跨平台安装程序。嗯,准备好了吗?