跳到主要内容

CMake 环境配置

本章将介绍如何搭建完整的 CMake 开发环境,包括开发环境配置、IDE 集成、构建工具、环境变量以及交叉编译基础。

1. 开发环境搭建

1.1 安装 CMake

Windows

方法一:官方安装包

  1. 访问 CMake 下载页面
  2. 下载 Windows 安装包(例如 cmake-3.28.0-windows-x86_64.msi
  3. 运行安装程序,勾选 "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 扩展:

  1. 打开 VS Code
  2. Ctrl+Shift+X 打开扩展面板
  3. 搜索 "CMake Tools"
  4. 点击安装

推荐扩展

  • 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 工具链配置

  1. 打开 File > Settings > Build, Execution, Deployment > Toolchains
  2. 添加或修改编译器、CMake、调试器路径

2.3 Visual Studio

Visual Studio 2017 及以上版本原生支持 CMake 项目:

  1. 打开 文件 > 打开 > CMake
  2. 选择 CMakeLists.txt 文件
  3. 使用顶部工具栏进行配置和构建

Visual Studio CMake 设置

  • CMakeSettings.json 中配置生成器和工具链
  • 支持 Windows、Linux、WSL 多目标构建

2.4 Qt Creator

Qt Creator 也对 CMake 有良好支持:

  1. 打开 文件 > 打开文件或项目
  2. 选择 CMakeLists.txt
  3. 配置构建目录和 Kit(编译器组合)

3. 构建工具

CMake 本身不执行编译,而是生成本地构建系统的配置文件。以下是常见的构建工具选择:

3.1 Windows 平台

工具说明
Visual Studio微软官方 IDE,集成 MSVC 编译器
MinGW-w64Windows 上的 GCC 移植版本
NinjaGoogle 开发的快速构建系统
# 使用 Visual Studio 2022 生成器
cmake -G "Visual Studio 17 2022" ..

# 使用 Ninja 生成器
cmake -G "Ninja" ..

# 使用 MinGW Makefiles
cmake -G "MinGW Makefiles" ..

3.2 Linux 平台

工具安装命令
GCCsudo apt install build-essential
Clangsudo apt install clang
Ninjasudo apt install ninja-build
Makesudo 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/CDNinja(构建速度快)

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 常用系统环境变量

变量作用
CCC 编译器路径
CXXC++ 编译器路径
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 Linuxarm-linux-gnueabihf-gcc树莓派等 ARM 设备
ARM64 Linuxaarch64-linux-gnu-gcc64 位 ARM 服务器
Android NDKAndroid NDK 工具链Android 应用开发
Windows CEMSVC 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 交叉编译注意事项

  1. 依赖库匹配:确保所有依赖库都为目标平台编译
  2. sysroot 配置:正确设置目标系统的根文件系统路径
  3. 测试方式:交叉编译的程序无法在宿主机直接运行,需传输到目标设备测试
  4. pkg-config 路径:可能需要设置 PKG_CONFIG_SYSROOT_DIRPKG_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

小结

本章我们学习了:

  1. 在 Windows、Linux、macOS 上安装和配置 CMake
  2. VS Code、CLion、Visual Studio 等 IDE 的集成配置
  3. Make、Ninja、MSBuild 等构建工具的选择和使用
  4. CMake 环境变量和缓存变量的配置方法
  5. 交叉编译的基本概念和工具链文件编写

练习

  1. 在你的系统上安装 CMake 并验证版本
  2. 配置 VS Code 的 CMake 开发环境
  3. 分别使用 Make 和 Ninja 生成器构建一个简单项目
  4. 编写一个 ARM 交叉编译工具链文件
  5. 使用 cmake -D 传递自定义变量并在 CMakeLists.txt 中使用