2、环境准备:安装CMake与CPack、验证环境、第一个CPack示例
2.1 为什么要先搞定环境?
说实话,很多同学学CPack卡住,不是因为概念难懂,而是环境没配好。我见过太多人花了一整天装CMake,结果版本不对,CPack根本跑不起来。所以这一章,咱们先把地基打牢。
你想想看,CPack是CMake的亲儿子,它俩共用一套安装包。你装好CMake,CPack自然就有了。但这里有个坑——版本太老的话,CPack的组件功能可能不全。我个人习惯用最新稳定版,至少3.20以上,这样后面讲组件安装时才不会碰壁。
2.2 安装CMake(含CPack)
2.2.1 Windows平台
去官网下载安装包,这个不用我多说了。但我要提醒你一点:安装时记得勾选“Add CMake to the system PATH”。我曾经因为忘了勾这个,在命令行里敲cmake死活找不到,折腾了半小时才发现是PATH没配。
安装完成后,打开命令提示符,验证一下:
cmake --version
你应该能看到类似这样的输出:
cmake version 3.28.1
然后试试CPack:
cpack --version
嗯,如果两个命令都能正常显示版本号,说明环境已经就绪。
2.2.2 Linux平台
Linux下安装就简单多了。用包管理器一把梭:
# Ubuntu/Debian
sudo apt update
sudo apt install cmake
# CentOS/RHEL/Fedora
sudo yum install cmake
# 或者
sudo dnf install cmake
但这里有个问题——系统自带的cmake版本往往偏老。比如Ubuntu 20.04默认装的是3.16,而我们需要3.20以上。怎么办?
我建议用Kitware官方提供的APT仓库:
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc | sudo apt-key add -
sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main'
sudo apt update
sudo apt install cmake
这样装的就是最新版了。
2.2.3 macOS平台
macOS用户直接用Homebrew:
brew install cmake
装完同样验证一下版本。
2.3 验证CPack是否可用
装好CMake后,CPack应该自动可用。但为了保险,我们还是做个快速验证。
创建一个空目录,比如叫test_cpack,在里面放一个最简单的CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(TestCPack VERSION 1.0.0)
install(TARGETS DESTINATION bin)
然后执行:
mkdir build && cd build
cmake ..
cpack -G TGZ
如果一切正常,你会看到一个TestCPack-1.0.0-Linux.tar.gz(Windows下可能是zip)。这说明CPack已经能正常工作了。
2.4 第一个CPack示例:打包一个Hello World
光验证还不够,咱们来点实际的。写一个真正的Hello World程序,然后用CPack打包。
2.4.1 项目结构
先创建项目目录:
hello_cpack/
├── CMakeLists.txt
├── src/
│ └── main.cpp
└── build/
2.4.2 源代码
src/main.cpp:
#include <iostream>
int main() {
std::cout << "Hello from CPack!" << std::endl;
return 0;
}
2.4.3 CMakeLists.txt
这是重点,我一步步解释:
cmake_minimum_required(VERSION 3.20)
project(HelloCPack VERSION 1.0.0 LANGUAGES CXX)
# 添加可执行文件
add_executable(hello src/main.cpp)
# 安装到bin目录
install(TARGETS hello DESTINATION bin)
# 配置CPack
set(CPACK_PACKAGE_NAME "HelloCPack")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A simple CPack example")
set(CPACK_GENERATOR "TGZ;ZIP") # 同时生成tar.gz和zip
include(CPack)
这里有个细节:include(CPack) 必须放在所有CPack变量设置之后。为什么?因为CPack模块在加载时会读取这些变量,顺序错了就读取不到。
2.4.4 构建和打包
进入build目录,执行:
cd build
cmake ..
make
cpack
你会看到类似这样的输出:
CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: HelloCPack
CPack: - Install project: HelloCPack
CPack: Create package
CPack: - package: /path/to/hello_cpack/build/HelloCPack-1.0.0-Linux.tar.gz
CPack: Create package using ZIP
CPack: - package: /path/to/hello_cpack/build/HelloCPack-1.0.0-Linux.zip
解压看看:
tar -xzf HelloCPack-1.0.0-Linux.tar.gz
./HelloCPack-1.0.0-Linux/bin/hello
输出:
Hello from CPack!
完美!你的第一个CPack包就这样诞生了。
2.5 常见问题与避坑
| 问题 | 原因 | 解决方法 |
|---|---|---|
| cmake命令找不到 | 未添加到PATH | 重新安装并勾选“Add to PATH”,或手动添加 |
| CPack版本太老 | 系统自带版本过低 | 从Kitware官方仓库安装最新版 |
| 打包时报错“No install target” | CMakeLists.txt中缺少install()命令 | 添加install(TARGETS ...)指令 |
| Windows下生成TGZ失败 | 缺少tar工具 | 改用ZIP格式,或安装Git Bash |
-G ZIP 就好。
2.6 本章小结
到这,环境就彻底搞定了。你学会了:
- 在不同平台上安装CMake(附带了CPack)
- 验证CPack是否正常工作
- 写了一个完整的Hello World项目并用CPack打包
下一章,我们会深入CPack的核心概念——组件安装。说白了,就是怎么把一个大项目拆成几个小包,让用户只装他们需要的部分。这个在实际项目中非常实用,比如你开发一个SDK,头文件、库文件、示例代码可以分开打包。
嗯,先到这。去喝杯咖啡,然后继续下一章吧。