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 平台
我个人习惯用官方安装包,简单直接。
- 去 https://cmake.org/download/ 下载
cmake-3.28.x-windows-x86_64.msi - 双击安装,记得勾选 "Add CMake to the system PATH for all users"
- 安装完成后,打开命令提示符验证:
cmake --version
cmake --version # 输出类似 cmake version 3.28.1
cpack --version # 输出类似 cpack version 3.28.1
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
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)或类似命名的文件生成。打开看看,里面应该有可执行文件。
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 同理
set(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_SOURCE_DIR}/dist"),这样所有包都统一输出到 dist/ 目录,方便后续上传或分发。
2.6 本章小结
说白了,环境准备就三件事:装对版本、验证安装、统一目录。别小看这一步,我见过太多人因为环境不一致,导致打包出来的东西在别人机器上跑不了。磨刀不误砍柴工,把这一步做扎实了,后面30章你会走得很顺。
下一章,咱们开始写第一个真正的CPack配置,打包一个带依赖的应用程序。到时候你会发现,今天配的环境有多重要。