Cmake
CMake 是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个函数库。
本文档在 Linux 环境 CentOS 7 系统测试:
# 基础知识
- 指定最低版本要求:
cmake_minimum_required(VERSION <version>) - 指定项目名和要求:
project(<project_name>) - 添加子目录:
add_subdirectory - 指定要生成的可执行文件和其源文件:
add_executable(<target> <source_files>...) - 可执行文件或库添加包含目录:
target_include_directories
target_include_directories(<target_name>
[BEFORE | AFTER]
[SYSTEM] [PUBLIC | PRIVATE | INTERFACE]
[items1...])
1
2
3
4
2
3
4
- 生成静态库(默认:STATIC)/动态库(SHARED)
add_library(<target> <source_files>...) - 链接目标文件与其他库:
target_link_libraries(<target> <libraries>...)
target_link_directories(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
1
2
3
2
3
- 设置变量的值:
set(<variable> <value>...)
set (VAR 'Hello, World!')
message(STATUS "Variable VAR is ${VAR}")
1
2
2
# 构建流程
Cmake 简化了 Makefile 繁琐的步骤,方便了开发者:
一个简单的例子:编译一个 main.cc
# 链接
main: main.o
g++ -o main main.o
# 汇编:.s -> .o -c
main.o: main.s
g++ -o main.o -c main.s
# 编译:.i -> .s -S
main.s: main.i
g++ -o main.s -S main.i
# 预处理:.cc -> .i -E
main.i: main.cc
g++ -o main.i -E main.cc
clean:
rm -f main main.o main.s main.i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
使用 Cmake 详细编译 DCMAKE_VERBOSE_MAKEFILE=ON:
# 构建实例
假设有下面的目录结构项目:
my_project/
├── CMakeLists.txt # 根目录 CMake 配置
├── README.md # 项目说明
├── .gitignore # Git 忽略文件
│
├── build/ # 构建目录(不提交到 Git)
│ ├── bin # 可执行文件
│ └── lib # 库文件
│
├── include/ # 公共头文件
│ └── my_project/ # 使用项目命名空间避免冲突
│ ├── module1.h
│ └── module2.h
│
├── src/ # 源代码
│ ├── CMakeLists.txt
│ ├── main.cpp # 主程序入口
│ ├── module1/
│ │ ├── CMakeLists.txt
│ │ └── module1.cpp
│ │
│ └── module2/
│ ├── CMakeLists.txt
│ └── module2.cpp
│
├── examples/ # 使用示例
│ ├── CMakeLists.txt
│ ├── example1/
│ │ └── main.cpp
│ └── example2/
│ └── main.cpp
│
├── docs/ # 文档
│ ├── Doxyfile
│ └── ...
│
├── scripts/ # 辅助脚本
│ ├── build.sh
│ ├── run_tests.sh
│ └── ...
│
├── third_party/ # 第三方依赖
│ ├── CMakeLists.txt
│ ├── googletest/
│ └── fmt/
│
└── configs/ # 配置文件
├── config.json
└── logging.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
- 基础模板:
- 根 CMakeLists.txt:
# 规定最低版本要求
cmake_minimum_required(VERSION 3.10)
# 项目名
project(MyApp)
# 设置 C++ 版本
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 设置输出目录设置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# 添加子目录
add_subdirectory(src)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- src/MakeLists.txt
set(RPC_SOURCES
rpc/rpc_server.cpp
# 添加所有 rpc 目录的 .cpp 文件
)
set(NET_SOURCES
net/socket.cpp
# 添加所有 net 目录的 .cpp 文件
)
# 合并所有源文件
set(ALL_SOURCES
${NET_SOURCES}
${RPC_SOURCES}
)
add_library(mylib ${ALL_SOURCES})
target_include_directories(mylib
PUBLIC ${CMAKE_SOURCE_DIR}/include
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 步骤:
cd build
cmake ..
cmake --build .
1
2
3
2
3
上次更新: 2026/04/07, 20:51:41