CMake 环境配置
本章将介绍如何搭建完整的 CMake 开发环境,包括开发环境配置、IDE 集成、构建工具、环境变量以及交叉编译基础。
1. 开发环境搭建
1.1 安装 CMake
Windows
方法一:官方安装包
- 访问 CMake 下载页面
- 下载 Windows 安装包(例如
cmake-3.28.0-windows-x86_64.msi) - 运行安装程序,勾选 "Add CMake to the system PATH"
方法二:使用包管理器
# 使用 Chocolatey
choco install cmake
# 使用 Scoop
scoop install cmake
# 使用 Winget
winget install Kitware.CMake
Linux
Ubuntu/Debian
# 使用 apt(可能不是最新版本)
sudo apt update
sudo apt install cmake
# 安装最新版本(推荐):添加 Kitware 仓库
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyrings.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyrings.gpg] https://apt.kitware.com/ubuntu/ jammy main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null
sudo apt update
sudo apt install cmake
CentOS/RHEL/Fedora
# Fedora
sudo dnf install cmake
# CentOS/RHEL
sudo yum install cmake
macOS
# 使用 Homebrew
brew install cmake
# 使用 MacPorts
sudo port install cmake
1.2 验证安装
# 检查版本
cmake --version
# 输出示例
cmake version 3.28.0
CMake suite maintained and supported by Kitware (kitware.com/cmake).
1.3 CMake GUI 工具
cmake-gui
CMake 提供了图形界面工具,适合初学者使用:
# Linux
cmake-gui
# Windows:从开始菜单启动 CMake (cmake-gui)
ccmake(终端交互界面)
# 在构建目录中运行
cd build
ccmake ..
2. IDE 集成
2.1 VS Code
安装 CMake Tools 扩展:
- 打开 VS Code
- 按
Ctrl+Shift+X打开扩展面板 - 搜索 "CMake Tools"
- 点击安装
推荐扩展
- CMake Tools:提供配置、构建、调试的集成支持
- CMake:CMakeLists.txt 语法高亮
- C/C++:微软官方 C/C++ 扩展
配置设置(settings.json)
{
"cmake.configureOnOpen": true,
"cmake.buildDirectory": "${workspaceFolder}/build",
"cmake.generator": "Ninja",
"cmake.parallelJobs": 8
}
2.2 CLion
CLion 原生支持 CMake,开箱即用:
- 自动检测 CMakeLists.txt
- 内置 CMake 配置界面
- 支持多种工具链切换
CLion 工具链配置
- 打开
File > Settings > Build, Execution, Deployment > Toolchains - 添加或修改编译器、CMake、调试器路径
2.3 Visual Studio
Visual Studio 2017 及以上版本原生支持 CMake 项目:
- 打开
文件 > 打开 > CMake - 选择
CMakeLists.txt文件 - 使用顶部工具栏进行配置和构建
Visual Studio CMake 设置
- 在
CMakeSettings.json中配置生成器和工具链 - 支持 Windows、Linux、WSL 多目标构建
2.4 Qt Creator
Qt Creator 也对 CMake 有良好支持:
- 打开
文件 > 打开文件或项目 - 选择
CMakeLists.txt - 配置构建目录和 Kit(编译器组合)
3. 构建工具
CMake 本身不执行编译,而是生成本地构建系统的配置文件。以下是常见的构建工具选择:
3.1 Windows 平台
| 工具 | 说明 |
|---|---|
| Visual Studio | 微软官方 IDE,集成 MSVC 编译器 |
| MinGW-w64 | Windows 上的 GCC 移植版本 |
| Ninja | Google 开发的快速构建系统 |
# 使用 Visual Studio 2022 生成器
cmake -G "Visual Studio 17 2022" ..
# 使用 Ninja 生成器
cmake -G "Ninja" ..
# 使用 MinGW Makefiles
cmake -G "MinGW Makefiles" ..
3.2 Linux 平台
| 工具 | 安装命令 |
|---|---|
| GCC | sudo apt install build-essential |
| Clang | sudo apt install clang |
| Ninja | sudo apt install ninja-build |
| Make | sudo apt install make |
# 使用 Unix Makefiles(默认)
cmake ..
# 使用 Ninja
cmake -G "Ninja" ..
3.3 macOS 平台
# 安装 Xcode 命令行工具
xcode-select --install
# 使用 Homebrew 安装 Ninja
brew install ninja
3.4 生成器选择建议
| 场景 | 推荐生成器 |
|---|---|
| Windows 开发 | Visual Studio 或 Ninja |
| Linux 服务器构建 | Unix Makefiles 或 Ninja |
| macOS 开发 | Xcode 或 Ninja |
| 跨平台/CI/CD | Ninja(构建速度快) |
4. 环境变量
CMake 使用多种环境变量和缓存变量来控制构建行为。
4.1 CMake 相关环境变量
| 变量 | 说明 |
|---|---|
CMAKE_PREFIX_PATH | 查找依赖库的搜索路径列表 |
CMAKE_MODULE_PATH | 自定义 CMake 模块的搜索路径 |
CMAKE_BUILD_TYPE | 构建类型(Debug/Release/RelWithDebInfo/MinSizeRel) |
CMAKE_INSTALL_PREFIX | 安装目标路径前缀 |
4.2 设置环境变量
在命令行中设置
# Linux/macOS
export CMAKE_PREFIX_PATH="/opt/opencv;/opt/boost"
cmake ..
# Windows PowerShell
$env:CMAKE_PREFIX_PATH = "C:\libs\opencv;C:\libs\boost"
cmake ..
在 CMakeLists.txt 中设置
# 设置缓存变量
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type")
# 添加搜索路径
list(APPEND CMAKE_PREFIX_PATH "/opt/mylibs")
# 使用 find_package 时的搜索路径
set(OpenCV_DIR "/opt/opencv/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
使用 cmake 命令行参数传递变量
cmake -DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_SHARED_LIBS=ON \
..
4.3 常用系统环境变量
| 变量 | 作用 |
|---|---|
CC | C 编译器路径 |
CXX | C++ 编译器路径 |
PATH | 系统可执行文件搜索路径 |
LD_LIBRARY_PATH | 运行时动态库搜索路径(Linux) |
# 指定编译器
export CC=gcc-12
export CXX=g++-12
cmake ..
4.4 编码相关环境变量(Windows)
在 Windows 上处理中文路径或源码时,可能需要设置编码:
# 在 CMakeLists.txt 中设置 UTF-8 编码
if(WIN32)
add_compile_options(/utf-8)
endif()
5. 交叉编译基础
交叉编译是指在一个平台上生成另一个平台可执行文件的编译方式,常用于嵌入式开发。
5.1 工具链文件
CMake 通过工具链文件(Toolchain File)配置交叉编译环境:
ARM Linux 交叉编译工具链示例
# arm-linux-toolchain.cmake
# 目标系统信息
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# 交叉编译器路径
set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++)
# 目标环境的根文件系统
set(CMAKE_FIND_ROOT_PATH /opt/arm-sysroot)
# 搜索策略
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
使用工具链文件
cmake -DCMAKE_TOOLCHAIN_FILE=arm-linux-toolchain.cmake ..
cmake --build .
5.2 常见交叉编译场景
| 场景 | 工具链 | 说明 |
|---|---|---|
| ARM Linux | arm-linux-gnueabihf-gcc | 树莓派等 ARM 设备 |
| ARM64 Linux | aarch64-linux-gnu-gcc | 64 位 ARM 服务器 |
| Android NDK | Android NDK 工具链 | Android 应用开发 |
| Windows CE | MSVC ARM 编译器 | 嵌入式 Windows |
5.3 Android 交叉编译
使用 Android NDK 进行交叉编译:
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-24 \
..
5.4 交叉编译注意事项
- 依赖库匹配:确保所有依赖库都为目标平台编译
- sysroot 配置:正确设置目标系统的根文件系统路径
- 测试方式:交叉编译的程序无法在宿主机直接运行,需传输到目标设备测试
- pkg-config 路径:可能需要设置
PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_PATH
# 在工具链文件中设置 pkg-config
set(ENV{PKG_CONFIG_SYSROOT_DIR} "/opt/arm-sysroot")
set(ENV{PKG_CONFIG_PATH} "/opt/arm-sysroot/usr/lib/pkgconfig")
常见问题
找不到编译器
# 指定编译器
cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..
# 或通过环境变量
export CC=gcc
export CXX=g++
cmake ..
路径问题
# 使用正斜杠(推荐,跨平台兼容)
set(SOURCES src/main.cpp src/utils.cpp)
# 或使用 ${CMAKE_CURRENT_SOURCE_DIR} 确保路径正确
set(SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/utils.cpp
)
构建类型未设置
# 单配置生成器需要显式指定
cmake -DCMAKE_BUILD_TYPE=Release ..
# 多配置生成器在构建时指定
cmake --build . --config Release
小结
本章我们学习了:
- 在 Windows、Linux、macOS 上安装和配置 CMake
- VS Code、CLion、Visual Studio 等 IDE 的集成配置
- Make、Ninja、MSBuild 等构建工具的选择和使用
- CMake 环境变量和缓存变量的配置方法
- 交叉编译的基本概念和工具链文件编写
练习
- 在你的系统上安装 CMake 并验证版本
- 配置 VS Code 的 CMake 开发环境
- 分别使用 Make 和 Ninja 生成器构建一个简单项目
- 编写一个 ARM 交叉编译工具链文件
- 使用
cmake -D传递自定义变量并在 CMakeLists.txt 中使用