从单文件到多文件工程:CMake 中的 include 机制与目录规范(C++ 工程入门第三课)

📅 发布时间:2026/7/14 0:28:43 👁️ 浏览次数:
从单文件到多文件工程:CMake 中的 include 机制与目录规范(C++ 工程入门第三课)
本系列为《CMake 工程化进阶》完整 8 篇体系。本篇目标从单文件程序升级为多文件工程并理解 CMake 的 include 机制。在上一课中我们用 CMake 构建了一个最小程序main.cpp但真实 C 工程绝不会只有一个文件。一个最简单的工程也会变成main.cpputil.cpputil.h这时候很多人就会遇到第一个错误fatal error: util.h: No such file or directory这一篇我们解决两个问题1️⃣ CMake 如何组织多文件工程2️⃣ CMake 如何管理头文件路径一、升级我们的工程结构我们把项目升级成这样MyApp/ src/ main.cpp util.cpp include/ util.h CMakeLists.txt这种结构是 C 工程常见规范src/放实现文件include/放头文件这样工程会非常清晰。二、实现一个简单工具模块util.h#pragma once void printMessage();util.cpp#include iostream #include util.h void printMessage() { std::cout Hello from util module! std::endl; }main.cpp#include util.h int main() { printMessage(); return 0; }三、更新 CMakeLists.txt现在我们需要告诉 CMake源文件在哪头文件在哪cmake_minimum_required(VERSION 3.15) project(MyApp) add_executable(app src/main.cpp src/util.cpp ) target_include_directories(app PRIVATE include )四、理解 target_include_directories这一行非常重要target_include_directories(app PRIVATE include)意思是为 targetapp添加头文件搜索路径 include/编译时实际效果类似g -Iinclude所以编译器就能找到#include util.h五、PRIVATE / PUBLIC / INTERFACE 初步理解CMake 有三种依赖传播方式关键字含义PRIVATE只在当前 target 使用PUBLIC当前 target 依赖它的 targetINTERFACE只给依赖它的 target在当前示例app没有其他依赖所以PRIVATE 就够了。更复杂的情况我们会在下一课讲。六、编译工程继续使用标准构建方式。第一步mkdir buildcd build第二步cmake ..第三步cmake --build .第四步运行./app输出Hello from util module!说明工程构建成功。七、为什么不要使用全局 include_directories旧式 CMake 写法会这样include_directories(include)这会污染整个工程。现代 CMake 推荐target_include_directories原因是依赖应该绑定在 target 上而不是全局。这是现代 CMake 的核心设计思想。八、现在你的工程能力升级了从上一课到这一课你完成了一个重要升级单文件程序main.cpp升级为多文件工程src/include/并且理解了头文件搜索路径target_include_directories现代 CMake 依赖管理这已经进入工程级开发思维。九、本课总结本课核心只有一句话CMake 使用 target 管理依赖关系。你需要记住两个关键点1️⃣ 源文件通过 add_executable / add_library 添加2️⃣ 头文件路径通过 target_include_directories 管理下一课预告下一篇将进入CMake 最核心的能力模块化工程我们将学习add_librarytarget_link_librariesPUBLIC / PRIVATE / INTERFACE并把当前工程升级为applib_util真正实现模块化工程结构。