CMakeLists.txt是构建逻辑脚本,核心为三层结构:项目定义(cmake_minimum_required+project)、源码组织(add_executable/add_library)、构建目标(编译选项、头文件路径、链接依赖);大型项目需模块化拆分并用作用域关键字管控可见性。

用 CMake 管理 C++ 项目,核心是写好 CMakeLists.txt —— 它不是配置文件,而是一份“构建逻辑脚本”。从零开始,关键不是背命令,而是理解三层结构:项目定义 → 源码组织 → 构建目标。
第一步:声明项目与基础要求
每个 CMakeLists.txt 必须以 cmake_minimum_required() 开头,明确最低 CMake 版本(推荐 3.10 或更高),避免因版本差异导致命令不可用。紧接着用 project() 声明项目名、支持的语言(CXX 表示 C++)和版本号:
// 示例:最简起点
cmake_minimum_required(VERSION 3.10)
project(MyApp VERSION 1.0 LANGUAGES CXX)
这一步会自动定义 PROJECT_NAME、PROJECT_VERSION 等变量,后续可直接引用。
第二步:声明可执行文件或库
用 add_executable() 或 add_library() 注册构建目标。参数是目标名 + 源文件列表(支持相对路径):
立即学习“C++免费学习笔记(深入)”;
-
add_executable(hello main.cpp utils.cpp)→ 生成可执行文件hello -
add_library(core STATIC core.cpp core.h)→ 生成静态库libcore.a -
add_library(network SHARED net_client.cpp)→ 生成动态库libnetwork.so(Linux)或network.dll(Windows)
注意:头文件(如 .h)不参与编译,但建议列出来,方便 IDE 识别和代码导航。
第三步:设置编译选项与依赖关系
让项目真正“工程化”,靠的是这两类指令:
-
编译属性:用
set_property()或target_compile_options()控制标准、警告、优化级别target_compile_options(hello PRIVATE -std=c++17 -Wall -Wextra) -
头文件搜索路径:用
target_include_directories()告诉编译器去哪里找#includetarget_include_directories(hello PRIVATE include/)(PRIVATE表示仅该目标使用) -
链接依赖:用
target_link_libraries()关联库(含系统库或第三方)target_link_libraries(hello PRIVATE core network)(CMake 自动处理libcore.a和libnetwork.so的路径与顺序)
进阶提示:模块化与跨平台适配
大型项目应拆分 CMakeLists.txt:根目录只负责全局设置和子目录引入,各模块自建自己的 CMakeLists.txt:
- 根目录中写:
add_subdirectory(src)、add_subdirectory(third_party) - 在
src/CMakeLists.txt中专注定义add_executable()和本地依赖 - 判断平台:
if(WIN32)、if(APPLE)、if(UNIX AND NOT APPLE),用于条件设置(如 Windows 需要target_link_libraries(app PRIVATE wsock32))
不复杂但容易忽略:始终用 PRIVATE/PUBLIC/INTERFACE 明确作用域,避免头文件路径或宏定义意外泄露到下游目标。











