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
)