CMake 基础教程:从零开始掌握核心概念
CMake 是现代 C/C++ 项目最主流的构建系统工具,它不直接编译代码,而是根据你写的 CMakeLists.txt 文件生成平台原生的构建脚本(如 Makefile、Ninja、Visual Studio 项目等)。本篇聚焦基础,帮助你快速上手最常用的命令和写法。
1. CMake 的基本工作流程
- 编写
CMakeLists.txt(项目配置文件) - 在构建目录执行:
cmake <源码路径> # 配置阶段:生成构建系统(Makefile 等)
cmake --build . # 构建阶段:真正编译
推荐始终使用源码外构建(out-of-source build):
mkdir build
cd build
cmake .. # .. 表示源码目录
cmake --build .
2. 最简 Hello World 项目
项目结构:
hello/
├── CMakeLists.txt
└── main.cpp
main.cpp
#include <iostream>
int main() {
std::cout << "Hello CMake!" << std::endl;
return 0;
}
CMakeLists.txt(基础必备三行)
cmake_minimum_required(VERSION 3.10) # 1. 指定 CMake 最低版本
project(HelloCMake # 2. 定义项目名称(可选指定语言)
VERSION 1.0
DESCRIPTION "My first CMake project"
LANGUAGES CXX) # 只启用 C++(默认启用 C 和 CXX)
add_executable(hello main.cpp) # 3. 生成可执行目标 hello
构建运行:
mkdir build && cd build
cmake ..
cmake --build .
./hello # Linux/macOS
# 或 hello.exe # Windows
3. 核心基础命令详解
| 命令 | 作用 | 常用写法 |
|---|---|---|
cmake_minimum_required(VERSION x.y) | 指定 CMake 最低版本,避免旧版本兼容问题 | cmake_minimum_required(VERSION 3.15) |
project(name) | 定义项目名称、版本、描述、语言 | project(MyApp LANGUAGES CXX C) |
add_executable(target sources...) | 创建可执行文件目标 | add_executable(app main.cpp util.cpp) |
add_library(target [STATIC|SHARED|MODULE] sources...) | 创建库目标 | add_library(mylib STATIC src.cpp)add_library(mylib SHARED src.cpp) |
target_include_directories(target scope dirs...) | 为目标添加头文件搜索路径 | target_include_directories(app PRIVATE include) |
target_link_libraries(target scope libs...) | 为目标链接库 | target_link_libraries(app PRIVATE pthread fmt) |
set(CMAKE_CXX_STANDARD 17) | 全局设置 C++ 标准 | set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED ON) |
scope(作用域)说明:
PRIVATE:只影响当前目标(编译时使用)INTERFACE:只影响依赖当前目标的其他目标PUBLIC:两者都影响(最常用)
4. 指定 C++ 标准(非常重要)
推荐方式(现代 CMake):
# 方法1:全局设置(简单)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 方法2:目标级别(更灵活,推荐)
target_compile_features(myapp PRIVATE cxx_std_17) # 支持 11/14/17/20/23
5. 多文件项目基础示例
项目结构:
myapp/
├── CMakeLists.txt
├── main.cpp
├── include/
│ └── utils.h
└── src/
└── utils.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(MyApp LANGUAGES CXX)
add_executable(myapp
main.cpp
src/utils.cpp
)
target_include_directories(myapp PRIVATE include) # 添加 include 目录
target_compile_features(myapp PRIVATE cxx_std_17)
6. 基础变量一览
| 变量 | 含义 | 示例 |
|---|---|---|
${PROJECT_NAME} | 项目名称 | MyApp |
${CMAKE_SOURCE_DIR} | 项目根源码目录 | /path/to/myapp |
${CMAKE_BINARY_DIR} | 构建目录 | /path/to/myapp/build |
${CMAKE_CURRENT_SOURCE_DIR} | 当前 CMakeLists.txt 所在目录 | 用于子目录 |
${CMAKE_CXX_COMPILER} | 使用的 C++ 编译器 | g++ / clang++ / cl.exe |
7. 常用构建类型
cmake .. -DCMAKE_BUILD_TYPE=Debug # 调试版(带 -g)
cmake .. -DCMAKE_BUILD_TYPE=Release # 发布版(带 -O3)
在多配置生成器(如 Visual Studio)中,可在 IDE 中切换 Debug/Release。
8. 基础小结 checklist
一个合格的基础 CMakeLists.txt 通常包含:
cmake_minimum_required(VERSION 3.15) # 现代版本起点
project(MyProject
VERSION 1.0
LANGUAGES CXX)
add_executable(${PROJECT_NAME} # 使用项目名作为目标名
main.cpp
src/file1.cpp
src/file2.cpp)
target_include_directories(${PROJECT_NAME} PRIVATE include)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
掌握以上内容,你已经能管理 90% 的小型到中型 C++ 项目了!
后续可以继续学习:
- 子目录管理(
add_subdirectory()) - 查找外部库(
find_package()) - 安装规则(
install()) - 测试(
add_test()+ CTest)
如果你想看更具体的例子(如添加第三方库、静态/动态库分离、多目录结构等),随时告诉我,我继续深入讲解!