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已经能正常工作了。

小提示: 如果你用的是Windows,第一次运行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
注意: 我曾经在Windows上折腾了半天,发现CPack默认不会生成TGZ,因为Windows没有原生的tar命令。后来我改用ZIP格式,或者装个Git Bash就解决了。如果你在Windows上遇到类似问题,直接指定 -G ZIP 就好。

2.6 本章小结

到这,环境就彻底搞定了。你学会了:

  • 在不同平台上安装CMake(附带了CPack)
  • 验证CPack是否正常工作
  • 写了一个完整的Hello World项目并用CPack打包

下一章,我们会深入CPack的核心概念——组件安装。说白了,就是怎么把一个大项目拆成几个小包,让用户只装他们需要的部分。这个在实际项目中非常实用,比如你开发一个SDK,头文件、库文件、示例代码可以分开打包。

嗯,先到这。去喝杯咖啡,然后继续下一章吧。