1、CPack入门:什么是CPack、CPack在CMake生态中的角色、为什么需要CPack、CPack的工作流程概览
1.1 什么是CPack?
CPack,说白了就是CMake官方自带的打包工具。
你写完了代码,用CMake构建好了项目,生成了可执行文件、库文件。然后呢?怎么把这些东西发给用户?总不能让人家自己编译吧。
CPack就是干这个的。它能把你的构建产物打包成各种格式——Windows上的NSIS安装包、macOS上的DMG、Linux上的DEB或RPM、甚至跨平台的ZIP压缩包。
我个人习惯把CPack看作是CMake的「最后一公里」。没有它,你的项目就永远停留在开发阶段,没法真正交付。
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虽然也有坑,但至少它把平台差异处理好了。
1.4 CPack的工作流程概览
CPack的工作流程其实很简单,就三步:
- 配置:在CMakeLists.txt里定义好install()规则和CPack相关变量。
- 构建:用CMake生成构建系统,然后编译项目。
- 打包:运行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压缩包
你想想看,就这么几行命令,就能生成不同平台的安装包。是不是挺省心的?
1.5 小结
CPack不是什么高深的东西。它就是CMake生态里负责「打包」的那个角色。你只要在CMakeLists.txt里写清楚安装规则,剩下的交给它就行。
从下一章开始,我们会一步步搭建一个完整的CPack项目。从最简单的ZIP包,到复杂的DEB/RPM包,再到跨平台安装程序。嗯,准备好了吗?