CMake 入门笔记

一、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 收集源文件。

相关推荐
汉克老师10 分钟前
GESP6级C++考试语法知识(十七、数据结构(三、认识队列 Queue))
数据结构·c++·队列·gesp6级·gesp六级·数组模拟队列
OSwich1 小时前
【 Godot 4 学习笔记】命名规范
笔记·学习·godot
吃吃今天努力学习了吗1 小时前
【大模型入门学习笔记】常见概念总结
笔记·学习
j_xxx404_2 小时前
Linux进程信号捕捉与操作系统运行本质深度解析
linux·运维·服务器·开发语言·c++·人工智能·ai
Lin_Aries_04213 小时前
从零部署GenieSim:基于OpenPI的仿真环境搭建与录制教程
笔记·具身智能·datawhale
vx-程序开发3 小时前
基于机器学习的动漫可视化系统的设计与实现-计算机毕业设计源码08339
java·c++·spring boot·python·spring·django·php
啊董dong4 小时前
noi-2026年5月12号小测验
数据结构·c++·算法
咩咦4 小时前
C++学习笔记24:构造函数初始化列表
c++·学习笔记·类和对象·构造函数·初始化列表·const引用
计算机安禾4 小时前
【c++面向对象编程】第43篇:可变参数模板(C++11):优雅处理不定长参数
java·开发语言·c++
tq10865 小时前
因果叙事、劳动分层与协作秩序
笔记