2、环境准备:CMake与CPack安装、验证安装、配置构建环境(Windows/Linux/macOS)

说实话,很多人在CMake上栽跟头,不是因为CMake本身多难,而是环境没配好就开始写代码。我见过太多人花半小时写CMakeLists.txt,却花一整天折腾安装路径不对、版本不兼容的问题。所以这一章,咱们先把地基打牢。

2.1 为什么我要强调版本一致性?

你可能觉得「装个CMake而已,有啥好讲的?」嗯,我以前也这么想。直到有一次,我在Windows上用CMake 3.20生成了一个工程,同事用3.10死活打不开——因为新版本的策略(policy)变了。从那以后,我养成了一个习惯:团队统一版本,并且用cmake_minimum_required明确声明。

CPack是CMake内置的打包工具,你装好CMake,它就跟着来了。不需要额外安装,这点很省心。

2.2 各平台安装指南

2.2.1 Windows 平台

我个人习惯用官方安装包,简单直接。

  1. 去 https://cmake.org/download/ 下载 cmake-3.28.x-windows-x86_64.msi
  2. 双击安装,记得勾选 "Add CMake to the system PATH for all users"
  3. 安装完成后,打开命令提示符验证:
cmake --version
cmake --version  # 输出类似 cmake version 3.28.1
cpack --version  # 输出类似 cpack version 3.28.1
⚠️ 注意: 如果你用Visual Studio,记得在安装时选择「将CMake注册为系统环境变量」。我曾经因为漏掉这一步,导致VS找不到CMake,折腾了半小时才发现是PATH没配好。

2.2.2 Linux 平台

Linux下我推荐用包管理器,省事。但要注意——apt源里的CMake版本通常比较老。比如Ubuntu 20.04默认装的是3.16,而CPack的一些新特性(比如CPACK_INSTALL_CMAKE_CONFIGURATIONS)需要3.18以上。

我的做法是:

# 先卸载旧版本(如果有)
sudo apt remove cmake

# 添加Kitware官方源(以Ubuntu 20.04为例)
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ focal main' | sudo tee /etc/apt/sources.list.d/kitware.list

sudo apt update
sudo apt install cmake cmake-curses-gui

# 验证
cmake --version
cpack --version
💡 小技巧: 如果你不想折腾源,也可以直接下载预编译的二进制包,解压后把bin目录加到PATH里。我有时候在CI环境就这么干,干净利落。

2.2.3 macOS 平台

macOS用户我强烈推荐用Homebrew。为什么?因为Homebrew会自动处理依赖,而且更新方便。

# 安装Homebrew(如果没有)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装CMake
brew install cmake

# 验证
cmake --version
cpack --version

如果你偏好图形界面,也可以下载 .dmg 安装包。但说实话,命令行用习惯了,我基本不碰GUI版本。

2.3 验证安装:一个简单的测试

装好了不代表就能用。我习惯写一个最小工程来验证CMake和CPack是否正常工作。你想想看,如果连最基本的配置都跑不通,后面打包再多格式也是白搭。

创建一个测试目录,里面放两个文件:

文件1:CMakeLists.txt

cmake_minimum_required(VERSION 3.18)
project(HelloCPack VERSION 1.0.0 LANGUAGES CXX)

add_executable(hello main.cpp)

# 启用CPack
include(CPack)

# 设置包信息
set(CPACK_PACKAGE_NAME "HelloCPack")
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A simple CPack test")
set(CPACK_GENERATOR "ZIP")  # 先试试ZIP格式

文件2:main.cpp

#include <iostream>
int main() {
    std::cout << "Hello CPack!" << std::endl;
    return 0;
}

然后执行:

mkdir build && cd build
cmake ..
cmake --build .
cpack

如果一切顺利,你会看到 HelloCPack-1.0.0-win64.zip(Windows)或类似命名的文件生成。打开看看,里面应该有可执行文件。

✅ 验证成功标志: 生成了 .zip 包,且解压后能正常运行 hello 程序。

2.4 配置构建环境:我踩过的坑

环境配置这块,我总结了几条血泪教训:

问题 现象 解决方案
CMake找不到编译器 cmake .. 报错 "No CMAKE_CXX_COMPILER could be found" Windows上安装Visual Studio Build Tools;Linux上安装 build-essential;macOS上安装Xcode Command Line Tools
CPack版本太老 某些Generator(如NSIS、DragNDrop)不可用 升级CMake到3.18+,我建议直接用3.28
PATH没配好 命令行输入 cmake 提示找不到命令 手动将CMake的bin目录添加到系统PATH,然后重启终端

我曾经在Windows上遇到过最诡异的问题:cmake --version 能正常输出,但 cpack --version 报错。后来发现是因为我装了多个版本的CMake,环境变量里先找到的是一个旧版本,而旧版本里没有CPack。解决办法很简单——把旧版本卸载干净,只留一个。

2.5 多平台构建目录结构建议

如果你像我一样需要在多个平台上打包,我建议你统一构建目录的命名规则。这样一眼就能看出是哪个平台、哪个配置:

project/
├── CMakeLists.txt
├── src/
├── build/
│   ├── windows-x64-release/
│   ├── linux-x64-release/
│   └── macos-x64-release/
└── dist/          # 打包输出目录

在构建时,我习惯这样指定输出目录:

# Windows
cmake -B build/windows-x64-release -DCMAKE_BUILD_TYPE=Release
cmake --build build/windows-x64-release
cd build/windows-x64-release && cpack

# Linux/macOS 同理
💡 我的习惯: 在CMakeLists.txt里加上 set(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_SOURCE_DIR}/dist"),这样所有包都统一输出到 dist/ 目录,方便后续上传或分发。

2.6 本章小结

说白了,环境准备就三件事:装对版本、验证安装、统一目录。别小看这一步,我见过太多人因为环境不一致,导致打包出来的东西在别人机器上跑不了。磨刀不误砍柴工,把这一步做扎实了,后面30章你会走得很顺。

下一章,咱们开始写第一个真正的CPack配置,打包一个带依赖的应用程序。到时候你会发现,今天配的环境有多重要。