当前位置: 首页 > news >正文

CMakeList 中 PUBLIC 和 PRIVATE的区别

例如:

target_include_directories 中 PUBLIC 和 PRIVATE 是用于控制头文件路径可见性的作用域关键字,核心区别在于:头文件路径是否会传递给依赖当前目标的其他目标

具体对比:

作用域对当前目标的影响对依赖目标的影响(如链接该目标的其他目标)典型使用场景
PUBLIC当前目标编译时会使用这些头文件路径依赖目标编译时也会自动继承这些头文件路径目标的公开头文件.h)所在路径,且这些头文件会被依赖目标包含(如库的对外接口头文件)。
PRIVATE当前目标编译时会使用这些头文件路径依赖目标不会继承这些头文件路径目标的内部私有头文件所在路径,仅当前目标自己使用,不对外暴露(如库内部实现用的头文件)。

示例说明:

假设项目结构如下:

myproject/
├── include/          # 公开头文件(对外接口)
│   └── mylib.h
├── src/
│   ├── mylib.cpp     # 库实现
│   └── internal.h    # 库内部私有头文件(不对外)
└── main.cpp          # 依赖 mylib 的可执行文件
1. 使用 PUBLIC 包含公开头文件
add_library(mylib src/mylib.cpp)# 公开头文件路径:mylib 自身需要,依赖它的目标(如 app)也需要
target_include_directories(mylibPUBLIC${CMAKE_CURRENT_SOURCE_DIR}/include  # 公开头文件路径
)
  • 编译 mylib 时,会从 include/ 查找 mylib.h
  • 若有可执行文件 app 依赖 mylib
add_executable(app main.cpp)
target_link_libraries(app mylib)  # app 会自动继承 mylib 的 PUBLIC 路径

编译 app 时,main.cpp 中 #include "mylib.h" 会自动从 include/ 查找,无需为 app 重复设置。

2. 使用 PRIVATE 包含私有头文件
target_include_directories(mylibPRIVATE${CMAKE_CURRENT_SOURCE_DIR}/src  # 私有头文件路径
)
  • 编译 mylib 时,mylib.cpp 中 #include "internal.h" 会从 src/ 查找。
  • 依赖 mylib 的 app 编译时,不会继承 src/ 路径(因为是 PRIVATE),即使 main.cpp 中尝试 #include "internal.h" 也会找不到(符合私有头文件不对外暴露的设计)。

总结

  • PUBLIC:头文件路径 “自用且共享”,适用于需要暴露给外部的接口头文件。
  • PRIVATE:头文件路径 “仅自用”,适用于内部实现相关的私有头文件。

http://www.dtcms.com/a/592505.html

相关文章:

  • langchain 环境搭建
  • 捷讯官网 网站建设中小型企业网站大全
  • 《算法闯关指南:优选算法--位运算》--36.两个整数之和,37.只出现一次的数字 ||
  • 素材网站开发做流量网站挂广告还能挣钱吗
  • 学习OPC UA,连接OPC UA服务器
  • 从零开始:构建你的第一个MCP服务器
  • 数据结构之二叉树-堆
  • BridgeVLA 对比 pi 0.5 有提升吗
  • 深度学习 :python水下海洋生物识别检测系统 Yolo模型 PyTorch框架 计算机 ✅
  • COM_QueryInterface
  • DeepSeek-OCR全面解析:技术原理、性能优势与实战指南
  • WebKit Insie: WebKit 调试(二)
  • 网站建设需求材料推广网店的途径和方法
  • 排名优化网站沈阳中小企业网站制作
  • 从0到1:兰亭妙微如何用“小程序思维”重构用户体验路径
  • AI重构天猫双11,一场新的效率革命
  • 智慧园区:数字中国的“微缩实验室”如何重构城市未来
  • 新技术如何重构AI营销获客的底层逻辑与竞争格局
  • [论文阅读] AI+ | AI重构工业数字孪生!新一代iDTS破解数据稀缺、智能不足难题,附3大落地案例
  • 京东的一次范围经济尝试,却改变了汽车营销游戏规则
  • 圆柱电池Pack生产线的极性与质量守护:视觉检测系统把好安全关
  • 【大数据技术03】机器学习与算法
  • A模块 系统与网络安全 第四门课 弹性交换网络-6
  • it之家网站源码wordpress门户主体
  • 浏览器访问web服务器经过了哪些过程
  • 时序数据库系列(七):性能监控实战指标收集
  • 【数据库】分布式事务篇
  • 《Windows 11 + Docker:极简DVWA靶场搭建全记录》—— 附详细排错指南与最终解决方案
  • 时序数据库系列(八):InfluxDB配合Grafana可视化
  • M3部署vllm