You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

哪个CMake属性存储SYSTEM PRIVATE类型的包含目录?

CMake target_include_directories 之 SYSTEM PRIVATE 场景解析

属性存储情况

官方文档仅明确SYSTEM搭配PUBLIC/INTERFACE时会填充INTERFACE_SYSTEM_INCLUDE_DIRECTORIES属性,但**SYSTEM PRIVATE指定的目录不会被存储到任何公开的CMake属性中**。原因在于PRIVATE作用域的目录仅作用于目标自身编译,无需传递给依赖项,因此CMake没有为这类目录设计专门的存储属性接口。

读取这些目录的方法

如果必须获取这些目录,可采用以下两种方案:

  • 解析编译命令文件
    开启CMAKE_EXPORT_COMPILE_COMMANDS选项,让CMake生成compile_commands.json文件。该文件记录了每个目标编译时的完整命令行,其中包含以-isystem开头的系统目录路径。你可以通过Python脚本、jq工具等解析这个JSON文件,提取对应目标的相关路径。
  • 自定义属性存储
    在调用target_include_directories的同时,手动将目录存入自定义的目标属性:
    # 定义要添加的系统私有目录
    set(MY_PRIVATE_SYSTEM_DIRS "/path/to/include1" "/path/to/include2")
    # 添加为SYSTEM PRIVATE目录
    target_include_directories(my_target SYSTEM PRIVATE ${MY_PRIVATE_SYSTEM_DIRS})
    # 存入自定义属性
    set_target_properties(my_target PROPERTIES PRIVATE_SYSTEM_INCLUDES "${MY_PRIVATE_SYSTEM_DIRS}")
    
    后续读取时使用get_target_property:
    get_target_property(PRIVATE_SYSTEM_DIRS my_target PRIVATE_SYSTEM_INCLUDES)
    

额外说明

SYSTEM PRIVATE能正常工作(为GCC添加-isystem编译标志),是因为CMake内部会处理PRIVATE作用域的系统目录,将其转换为编译器对应的编译选项,但不会对外暴露存储这些目录的属性——毕竟PRIVATE目录本就仅属于目标自身,无需让其他逻辑访问。

内容的提问来源于stack exchange,提问作者Aleksandr Medvedev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:33:10