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:头文件路径 “仅自用”,适用于内部实现相关的私有头文件。
