cen's blog cen's blog
首页
  • 编程文章

    • Markdown使用
    • C语言程序的运行
  • 学习笔记

    • C++学习
    • C++数据结构
    • MySQL
    • Linux
    • 网络编程
算法
  • Git
  • ProtoBuf
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

cen

十年饮冰,难凉热血
首页
  • 编程文章

    • Markdown使用
    • C语言程序的运行
  • 学习笔记

    • C++学习
    • C++数据结构
    • MySQL
    • Linux
    • 网络编程
算法
  • Git
  • ProtoBuf
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • Git
  • Protobuf
  • Cmake
    • 基础知识
    • 构建流程
    • 构建实例
  • 工具
cen
2025-11-29
目录

Cmake

CMake 是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个函数库。

本文档在 Linux 环境 CentOS 7 系统测试:

# 基础知识

  1. 指定最低版本要求:cmake_minimum_required(VERSION <version>)
  2. 指定项目名和要求:project(<project_name>)
  3. 添加子目录:add_subdirectory
  4. 指定要生成的可执行文件和其源文件:add_executable(<target> <source_files>...)
  5. 可执行文件或库添加包含目录:target_include_directories
target_include_directories(<target_name>
  [BEFORE | AFTER]
  [SYSTEM] [PUBLIC | PRIVATE | INTERFACE]
  [items1...])
1
2
3
4
  1. 生成静态库(默认:STATIC)/动态库(SHARED)add_library(<target> <source_files>...)
  2. 链接目标文件与其他库:target_link_libraries(<target> <libraries>...)
target_link_directories(<target> [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
1
2
3
  1. 设置变量的值:set(<variable> <value>...)
set (VAR 'Hello, World!')
message(STATUS "Variable VAR is ${VAR}")
1
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

使用 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
  1. 基础模板:
  • 根 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
  • 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
  1. 步骤:
cd build
cmake ..
cmake --build .
1
2
3
上次更新: 2026/04/07, 20:51:41
Protobuf

← Protobuf

最近更新
01
位运算
04-21
02
单例模式
04-14
03
分治和归并
04-14
更多文章>
Theme by Vdoing | Copyright © 2024-2026 京ICP备2020044002号-3 京公网安备11010502056119号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式