CMakeLists.txt是构建逻辑脚本,核心为三层结构:项目定义(cmake_minimum_required+project)、源码组织(add_executable/add_library)、构建目标(编译选项、头文件路径、链接依赖);大型项目需模块化拆分并用作用域关键字管控可见性。
用 C
Make 管理 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() 注册构建目标。参数是目标名 + 源文件列表(支持相对路径):
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 明确作用域,避免头文件路径或宏定义意外泄露到下游目标。