cmakelists.txt编写需按项目结构分层配置:单文件三行必备;多文件显式列出源码;多目录时根文件用add_subdirectory,子目录用target_include_directories隔离头文件;库项目须先定义库再链接,且add_subdirectory顺序不可颠倒。

刚写完第一个C++程序,想用CMake管理却卡在CMakeLists.txt怎么写——单个main.cpp要三行,加个头文件就报找不到,再拆成src和include目录直接编译失败,根本不知道该把哪段配置放在哪一级CMakeLists.txt里。
单文件项目:三行就能跑通
新建一个CMakeLists.txt,只写这三行:
cmake_minimum_required(VERSION 3.10)
project(HelloWorld LANGUAGES CXX)
add_executable(hello main.cpp)
这三行缺一不可:【VERSION 3.10是底线,低于此版本不支持现代C++特性】;project名字可以任意,但LANGUAGES CXX必须显式声明,否则CMake可能按C语言规则处理.cpp文件;add_executable的第二个参数必须是真实存在的源文件名,拼错或路径不对会直接报错“no such file”。
同一目录多源文件:手动列比自动扫更稳
方法一:显式列出所有.cpp文件
add_executable(app main.cpp utils.cpp logger.cpp)
方法二:用set变量集中管理
set(SOURCES main.cpp utils.cpp logger.cpp)
add_executable(app ${SOURCES})
【绝对不要用file(GLOB SOURCES "*.cpp")】——新增一个helper.cpp后,CMake不会自动感知,必须手动删掉build目录重来,新手踩坑率90%。
标准多目录结构:根目录+src子目录
第一步:创建目录骨架
my_project/
├── CMakeLists.txt ← 根配置
├── include/ ← 公共头文件
│ └── utils.h
├── src/
│ ├── CMakeLists.txt ← 模块配置
│ ├── main.cpp
│ └── utils.cpp
└── build/ ← 编译输出(空目录)
第二步:写根CMakeLists.txt
CMake 4.3.2 Windows x86_64 历史版本安装包,适合旧项目兼容、构建环境回退、CMakeLists.txt 迁移验证、Visual Studio/Ninja/Makefile 生成器测试和 C/C++ 项目维护。
cmake_minimum_required(VERSION 3.10)
project(MyApp LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(src)
第三步:写src/CMakeLists.txt
add_executable(my_app main.cpp utils.cpp)
target_include_directories(my_app PRIVATE ${CMAKE_SOURCE_DIR}/include)
注意:target_include_directories里的PRIVATE表示只让my_app内部看到include路径,其他目标看不到——这是模块隔离的关键,漏写会导致后续加新模块时头文件冲突。
带静态库的分层结构:先编库再链接
方法一:根目录统一配置(适合小项目)
cmake_minimum_required(VERSION 3.10)
project(LibDemo LANGUAGES CXX)
add_library(utils STATIC src/utils.cpp)
add_executable(app src/main.cpp)
target_link_libraries(app PRIVATE utils)
target_include_directories(utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
方法二:子目录自治(推荐中大型项目)
根CMakeLists.txt里只留这两行:
add_subdirectory(src)
add_subdirectory(app)
src/CMakeLists.txt写库:
add_library(utils STATIC utils.cpp)
target_include_directories(utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
app/CMakeLists.txt写主程序:
add_executable(demo main.cpp)
target_link_libraries(demo PRIVATE utils)
这一步必须保证add_subdirectory(src)写在add_subdirectory(app)前面,否则链接时找不到utils目标——顺序错了会报“target not found”错误,且不提示具体哪行出问题。










