CMake Target 依赖传递与属性速查
在多模块 C++ 工程中,避免在根目录使用 include_directories()、add_definitions() 和 link_libraries(),防止头文件搜索路径污染和宏定义泄漏。统一按 Target 声明依赖范围。
关于渲染模块的源码示例见 [[FrameGraph 资源生命周期与渲染管线对比]],交叉编译固件的内核移植见 [[LiteOS Cortex-M 内核移植:中断向量表与 PendSV 上下文切换]]。
PRIVATE / PUBLIC / INTERFACE 传递范围
假设模块 EngineCore 依赖第三方库 Abseil,而上层可执行文件 EditorApp 链接了 EngineCore:
| 作用域关键字 | EngineCore 内部可见 | 下游 EditorApp 继承 | 适用场景 |
|---|---|---|---|
PRIVATE | 是 | 否 | 仅在 .cpp 内部使用的实现依赖(如内部压缩库、解析库) |
PUBLIC | 是 | 是 | 在公开头文件 .h 中暴露了该库类型的依赖 |
INTERFACE | 自身不编译 | 是 | 纯头文件库(Header-only)或统一导出编译规范的接口 Target |
静态库模块 CMakeLists.txt 示例
add_library(MQEngineCore STATIC
src/manager/resource_loader.cpp
src/renderer/frame_graph.cpp
)
target_include_directories(MQEngineCore
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<INSTALL_INTERFACE:include>
)
target_compile_features(MQEngineCore PUBLIC cxx_std_20)
target_link_libraries(MQEngineCore
PUBLIC
FCT::ThirdParty
PRIVATE
lz4::lz4
) 出链引用 (Outgoing Links) 2