一、CMake 是什么?
CMake 是一个跨平台的构建工具,用来告诉编译器怎么编译你的代码。
| 类比 | 说明 |
|---|---|
| 你写的代码 | 原材料(砖头、水泥) |
| CMake | 施工图纸(告诉工人怎么盖) |
| 编译器(g++/cl.exe) | 工人(按图纸施工) |
| 可执行文件 | 盖好的房子 |
二、为什么需要 CMake?
不同平台的编译方式不同:
| 平台 | 编译方式 |
|---|---|
| Linux | Makefile |
| Windows | Visual Studio 项目文件 |
| Mac | Xcode 项目文件 |
CMake 帮你自动生成这些平台对应的编译文件,不用你手写。
三、CMake 常用命令
1. 版本和项目
cpp
cmake_minimum_required(VERSION 3.0) # 要求 CMake 最低版本
project(MyProject) # 项目名称
2. 设置 C++ 标准
cpp
set(CMAKE_CXX_STANDARD 17) # 使用 C++17 标准
3. 指定可执行文件输出目录
cpp
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
-
EXECUTABLE_OUTPUT_PATH:系统变量,设置可执行文件的输出路径 -
${PROJECT_SOURCE_DIR}:当前工程的绝对路径
4. 指定头文件目录
cpp
include_directories(${PROJECT_SOURCE_DIR}/include)
告诉编译器去哪里找 .h 或 .hpp 头文件。
5. 收集源文件
cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
-
将
src目录下所有源文件(.cpp)收集到变量SRC_LIST中 -
避免手动一个一个添加
6. 添加子目录
cpp
add_subdirectory(exmp)
编译子目录 exmp,该目录下也需要有自己的 CMakeLists.txt。
7. 生成可执行文件
cpp
add_executable(myapp main.cpp) # 单个源文件
add_executable(myapp ${SRC_LIST}) # 多个源文件(使用变量)
8. 链接库
cpp
target_link_libraries(myapp pthread) # 链接 pthread 库
四、完整示例
目录结构
cpp
MyProject/
├── CMakeLists.txt
├── include/
│ └── mylib.h
├── src/
│ ├── main.cpp
│ └── mylib.cpp
└── bin/ # 编译后生成的可执行文件放这里
顶层 CMakeLists.txt
cpp
cmake_minimum_required(VERSION 3.0)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
# 可执行文件输出到 bin 目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
# 收集源文件
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
# 生成可执行文件
add_executable(myapp ${SRC_LIST})
编译步骤
bash
# 1. 创建 build 目录(推荐在外部编译)
mkdir build && cd build
# 2. 生成 Makefile
cmake ..
# 3. 编译
make
# 4. 运行
./../bin/myapp
五、CMake 变量说明
| 变量 | 含义 |
|---|---|
${PROJECT_SOURCE_DIR} |
项目根目录(包含顶层 CMakeLists.txt 的目录) |
${PROJECT_BINARY_DIR} |
编译目录(运行 cmake 的目录) |
${EXECUTABLE_OUTPUT_PATH} |
可执行文件输出路径 |
${LIBRARY_OUTPUT_PATH} |
库文件输出路径 |
六、常用命令速查
| 命令 | 作用 |
|---|---|
cmake_minimum_required(VERSION x.x) |
指定 CMake 最低版本 |
project(名称) |
设置项目名称 |
set(变量名 值) |
设置变量 |
add_executable(名称 源文件) |
生成可执行文件 |
add_library(名称 源文件) |
生成库文件 |
include_directories(路径) |
添加头文件搜索路径 |
aux_source_directory(路径 变量) |
收集目录下所有源文件 |
add_subdirectory(路径) |
添加子目录 |
target_link_libraries(目标 库名) |
链接库 |
七、一句话总结
CMake 是跨平台的编译配置工具。常用命令:
project设置项目名,add_executable生成可执行文件,include_directories指定头文件路径,aux_source_directory收集源文件。