target_include_directories对比 PUBLIC / PRIVATE
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录一、表述详解核心结论补充核心定义关键二、完整项目示例1. 项目目录结构2. 源码文件include/lib.h库的公共接口src/lib.cpp库的实现文件src/main.cpp主程序3. CMake 构建脚本写法1使用 PUBLIC标准正确用法写法2错误演示改用 PRIVATE4. 编译与效果测试编译命令终端执行结果对比三、PRIVATE 的**正确使用场景**调整后的目录结构新增文件src/private_inc/internal.h修改 src/lib.cpp优化后的 CMake 配置效果四、总结通过实操对比PUBLIC/PRIVATE的效果一、表述详解cmake_demo/ ├── include/ │ └── lib.h# 带导出宏的头文件├── src/ │ ├── lib.cpp# 动态库实现│ └── main.cpp# 调用方程序└── CMakeLists.txt核心结论target_include_directories(mylib PRIVATE 路径)的适用场景该头文件路径仅被lib.cpp库的实现文件使用不会被main.cpp依赖该库的外部代码包含此时用PRIVATE如果外部代码main.cpp需要包含这个路径下的头文件lib.h必须用PUBLIC否则外部目标会找不到头文件。补充核心定义关键作用域适用场景PUBLIC路径既给lib.cpp用也给所有依赖 mylib 的目标如main.cpp用接口头文件路径PRIVATE路径仅给lib.cpp自用不传递给外部依赖目标库内部私有头文件路径INTERFACE路径不给自身用仅传递给外部依赖目标二、完整项目示例1. 项目目录结构采用标准工程规范公共头文件放在include目录源文件放在src目录cmake_demo/ ├── include/ # 公共头文件目录外部可访问 │ └── lib.h # 库接口声明 ├── src/ │ ├── lib.cpp # 库实现文件 │ └── main.cpp # 主程序调用库函数 └── CMakeLists.txt # 构建脚本2. 源码文件include/lib.h库的公共接口头文件保护宏防止重复包含声明加法函数会被main.cpp直接包含#ifndefLIB_H#defineLIB_H// 加法函数声明对外提供的接口intadd(inta,intb);#endif// LIB_Hsrc/lib.cpp库的实现文件包含公共头文件实现加法逻辑// 包含库的接口头文件#includelib.h// 实现加法函数intadd(inta,intb){returnab;}src/main.cpp主程序调用库的add函数需要包含lib.h#includestdio.h// 包含库的公共头文件#includelib.hintmain(){intresadd(10,20);printf(10 20 %d\n,res);return0;}3. CMake 构建脚本写法1使用PUBLIC标准正确用法因为main.cpp需要依赖include路径找到lib.h因此路径需要传递给外部目标用PUBLICcmake_minimum_required(VERSION 3.15) project(AddLibraryDemo) # C标准配置 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 1. 创建静态库目标 mylib add_library(mylib src/lib.cpp) # 2. 为库添加头文件路径PUBLIC 表示路径自身可用且传递给依赖它的目标 target_include_directories(mylib PUBLIC include) # 3. 创建可执行目标 add_executable(main_app src/main.cpp) # 4. 链接库main_app 会自动继承 mylib 的 PUBLIC/INTERFACE 头文件路径 target_link_libraries(main_app PRIVATE mylib)写法2错误演示改用PRIVATE如果我们把PUBLIC改为PRIVATE代表include路径仅给 mylib 自身使用不传递# 仅修改这一行其余代码不变 target_include_directories(mylib PRIVATE include)4. 编译与效果测试编译命令终端执行# 创建构建目录并进入mkdirbuildcdbuild# 生成构建文件cmake..# 编译make结果对比PUBLIC配置编译成功运行./main_app输出10 20 30PRIVATE配置编译直接报错提示找不到头文件fatal error: lib.h: No such file or directory #include lib.h原因main_app无法继承include路径编译器找不到头文件。三、PRIVATE的正确使用场景为了让你理解PRIVATE不是无用的我们扩展场景给库添加私有内部头文件仅lib.cpp使用外部无需访问。调整后的目录结构cmake_demo/ ├── include/ # 公共头文件对外 │ └── lib.h ├── src/ │ ├── private_inc/ # 库私有头文件仅内部用 │ │ └── internal.h │ ├── lib.cpp │ └── main.cpp └── CMakeLists.txt新增文件src/private_inc/internal.h#ifndefINTERNAL_H#defineINTERNAL_H// 库内部使用的工具函数不对外部暴露staticintcalc(intx){returnx*2;}#endif修改src/lib.cpp#includelib.h// 包含私有内部头文件#includeinternal.hintadd(inta,intb){// 调用内部工具函数returncalc(ab);}优化后的 CMake 配置公共路径用PUBLIC私有路径用PRIVATEcmake_minimum_required(VERSION 3.15) project(AddLibraryDemo) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(mylib src/lib.cpp) # 公共头文件传递给外部依赖目标 target_include_directories(mylib PUBLIC include) # 私有头文件仅库自身使用不传递 target_include_directories(mylib PRIVATE src/private_inc) add_executable(main_app src/main.cpp) target_link_libraries(main_app PRIVATE mylib)效果main_app能继承include路径正常找到lib.hmain_app无法访问src/private_inc路径保证了库内部实现的封装性lib.cpp可以同时找到公共头文件和私有头文件。四、总结表述纠正当main.cpp依赖该头文件路径时必须用PUBLIC仅lib.cpp依赖时才用PRIVATE核心规则对外暴露的接口头文件路径 →PUBLIC传递给依赖目标库内部私有的实现头文件路径 →PRIVATE仅自身使用封装隔离单目标/多目标通用这套规则是现代CMake的标准规范无论项目大小都推荐使用比全局的include_directories更安全、更易维护。

相关新闻

手机远控电脑核心性能榜,评选10款软件,画质的终极对决

手机远控电脑核心性能榜,评选10款软件,画质的终极对决

手机远控电脑核心性能榜,评选10款软件,画质的终极对决对于移动办公、紧急处理文件或远程协助而言,用手机控制电脑的体验好坏,几乎完全取决于两个最直观的要素:连接速度和画面质量。前者决定了操作是否跟手,…

2026/5/17 2:30:30 阅读更多 →
从人鼠到植物:SEdb 3.0数据库一站式检索与分析超级增强子调控网络

从人鼠到植物:SEdb 3.0数据库一站式检索与分析超级增强子调控网络

超级增强子(SE)作为驱动细胞身份决定和关键致病基因表达的核心调控元件,一直是表观遗传学领域的研究热点,也是近年国自然的热点。然而,长期以来,相关的数据资源和注释工具主要集中于人类和小鼠模型。对于植…

2026/5/17 2:30:29 阅读更多 →
SW草图绘制之倒角和圆角

SW草图绘制之倒角和圆角

SW草图绘制之倒角和圆角

2026/7/5 9:21:23 阅读更多 →

最新新闻

OpenCode状态持久化:如何用企业级快照技术重塑开发工作流

OpenCode状态持久化:如何用企业级快照技术重塑开发工作流

OpenCode状态持久化:如何用企业级快照技术重塑开发工作流 【免费下载链接】opencode The open source coding agent. 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 当开发者在解决复杂问题时突然被打断,他们面临的不仅是思路中…

2026/7/6 16:58:31 阅读更多 →
Go项目配置管理难题:基于反射的TOML自动化解析实战

Go项目配置管理难题:基于反射的TOML自动化解析实战

Go项目配置管理难题:基于反射的TOML自动化解析实战 【免费下载链接】toml TOML parser for Golang with reflection. 项目地址: https://gitcode.com/gh_mirrors/toml/toml 在Go语言项目中,配置文件管理常面临类型安全、版本兼容性和文档同步的挑…

2026/7/6 16:54:28 阅读更多 →
国家图书馆ISBN插件:3分钟实现Calibre图书信息自动化管理的终极指南

国家图书馆ISBN插件:3分钟实现Calibre图书信息自动化管理的终极指南

国家图书馆ISBN插件:3分钟实现Calibre图书信息自动化管理的终极指南 【免费下载链接】NLCISBNPlugin 基于中国国家图书馆ISBN检索的calibre的source/metadata插件。https://doiiars.com/article/NLCISBNPlugin 项目地址: https://gitcode.com/gh_mirrors/nl/NLCIS…

2026/7/6 16:50:20 阅读更多 →
如何通过浏览器扩展自动化Markdown格式转换:Copy as Markdown技术实现详解

如何通过浏览器扩展自动化Markdown格式转换:Copy as Markdown技术实现详解

如何通过浏览器扩展自动化Markdown格式转换:Copy as Markdown技术实现详解 【免费下载链接】copy-as-markdown A browser extension to copy tabs and links as Markdown 项目地址: https://gitcode.com/gh_mirrors/co/copy-as-markdown 在技术文档编写、学术…

2026/7/6 16:46:14 阅读更多 →
高效百度网盘秒传链接实战指南:5个智能文件管理技巧解析

高效百度网盘秒传链接实战指南:5个智能文件管理技巧解析

高效百度网盘秒传链接实战指南:5个智能文件管理技巧解析 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 百度网盘秒传链接工具是一款强大…

2026/7/6 16:46:14 阅读更多 →
如何巧妙绕过Cursor试用限制:深度解析设备标识重置技术方案

如何巧妙绕过Cursor试用限制:深度解析设备标识重置技术方案

如何巧妙绕过Cursor试用限制:深度解析设备标识重置技术方案 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Your request has been blocked as our system has detected suspicious activity / Youve reached your trial request li…

2026/7/6 16:44:10 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻