从单文件到多文件工程:CMake 中的 include 机制与目录规范(C++ 工程入门第三课) 📅 发布时间:2026/7/14 0:28:43 👁️ 浏览次数: 本系列为《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真正实现模块化工程结构。
Python数据分析项目实战(014)——NumPy常用函数 版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl np.sqrt(x) 用途:计算数组中各元素的平方根。 示例: import numpy as np# 定义一个数组 x = np.array([4, 2026/7/13 12:39:21
关于copilot无法使用解决方案:似乎http://copilot.microsoft.com关闭了连接。 修改代理软件关于microsoft.com的规则编辑规则——>匹配域名后缀 (DOMAIN-SUFFIX)——>国外流量匹配域名后缀 (DOMAIN-SUFFIX) —— 最常用含义:只要域名的结尾(后缀)包含你填的内容,就会被匹配。它不仅匹配这个域名本身&am… 2026/5/17 8:48:26
【第1章·第15节】MATLAB/C语言混合编程应用5——BP神经网络训练 目录 1.引言 2.BP神经网络训练的原理 2.1 前向传播 2.2 损失计算 2.3 反向传播 2.4 权重更新 3.BP神经网络训练的matlab编程实现 4.BP神经网络训练的C编程实现 5.讲解视频 1.引言 BP(Back Propagation)神经网络是一种基于误差反向传播的多层前馈神经网络,核心是“前… 2026/7/13 4:57:46
【Claude多语言翻译能力深度测评】:覆盖127种语言,实测准确率高达92.3%的隐藏技巧曝光 更多请点击: https://codechina.net 第一章:Claude多语言翻译能力的底层架构与技术演进 Claude系列模型的多语言翻译能力并非依赖传统统计机器翻译(SMT)或独立编码器-解码器结构,而是深度内生于其统一的自回归语言建模… 2026/7/14 0:27:27
Unity Addressables资源热更新实战:三步实现高效增量更新 1. 项目概述与核心价值最近在项目里折腾资源热更新,发现很多团队还在用传统的AssetBundle,每次更新都得重新打包、上传、下载,流程繁琐不说,还容易出错。后来我们全面转向了Unity的Addressables系统,发现它简直是资源管… 2026/7/14 0:23:25
Kyoto Denkiki KDS-30350RH 电源模块 Kyoto Denkiki KDS-30350RH 电源模块 产品特点Kyoto Denkiki KDS-30350RH 电源模块出自日本京都电机器,专为半导体刻蚀等精密工艺设备提供高压直流供电,输出强劲、运行稳定。以下为该型号的十五项主要特点:京都电机器原厂出品,日本… 2026/7/14 0:21:24
装修家装电销机器人 在装修家装行业,传统电销面临诸多痛点,电销机器人的出现为行业带来了新的发展契机。传统电销痛点凸显装修家装行业传统电销工作强度大,人工成本高。有数据显示,人工坐席每天要拨打大量电话,其中无效号码占比达一定比例… 2026/7/14 0:21:24
孤能子视角:科学理论史关系解构法(1+7框架) (在以下的与AI互动中,在EIS理论约束下,DeepSeek叫信兄,Kim叫酷兄,我呢叫水兄。姑且当科幻小说看) (已由信兄整理成文)科学理论史关系解构法(17框架) ——EIS理论库科学史分析工具方法论锚定 日期࿱… 2026/7/14 0:19:23
puzzle(1039)划斜线、孤岛迷宫、轮辐连线 目录 划斜线 5*5 策略 7*7 8*8 12*10 孤岛迷宫 初级 中级 策略一:孤岛 策略二:均衡 高级 策略三:大数字分析 专家 策略四:十字路口 轮辐连线 规则 4*4 6*6 划斜线 在线play 在每个方格中划一条对角线… 2026/7/14 0:15:16
XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南 1. 项目概述:当游戏语言成为一堵墙作为一名玩了十几年日系、欧美独立游戏的“老油条”,我太懂那种面对一款心仪已久、画风玩法都戳中G点的游戏,却因为语言不通而望而却步的痛了。尤其是那些基于Unity引擎开发的、体量不大但内容精良的作品&am… 2026/7/14 0:05:14
2026普通文员学数据分析的价值 一、2026年普通文员学习数据分析的必要性随着数字化转型加速,数据分析技能正逐渐成为职场基础能力。普通文员学习数据分析可以提升工作效率、增强竞争力,并为职业转型提供更多可能性。二、数据分析对文员的价值自动化办公:通过数据分析工具&a… 2026/7/14 0:05:14
2026从计划员到主管,生产管理者学数据分析有用吗? 一、生产管理领域的职业发展路径 从计划员到主管的角色转变,是生产管理者职业发展的典型路径。计划员主要负责生产排程、库存管理和资源协调等基础工作,而主管则需要承担团队管理、决策支持和效率优化等更高级别的职责。这种转变不仅仅是职位的提升&… 2026/7/14 0:05:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/13 9:31:08
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/13 2:34:55