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

CMake无需中间变量将T1预处理器定义复制到T2的正确方法

报错原因

你调用target_compile_definitions时缺少必填的作用域参数(PRIVATE/PUBLIC/INTERFACE),因此触发参数非法报错。

正确实现方式

以下两种方案都不需要提前用get_target_property读取属性存入中间变量:

  • 方案1:补全作用域后直接用生成器表达式传入属性,适合需要灵活控制继承的定义作用域的场景
# 示例为作为T2的私有编译定义导入,可根据需求替换为PUBLIC/INTERFACE
target_compile_definitions(T2 PRIVATE $<TARGET_PROPERTY:T1,COMPILE_DEFINITIONS>)
  • 方案2:直接设置T2的编译定义属性,适合不需要调整作用域、直接全量继承的场景
set_target_properties(T2 PROPERTIES COMPILE_DEFINITIONS $<TARGET_PROPERTY:T1,COMPILE_DEFINITIONS>)

如果你的场景下只需要继承T1对外暴露的PUBLIC和INTERFACE级编译定义,也可以通过目标关联实现(仅CMake 3.11+支持):

target_link_libraries(T2 PRIVATE T1)

如果不需要T2链接T1的二进制产物,仅继承编译属性,可以搭配接口库实现:将T1的编译定义全部设置到一个独立的接口库,再让T1和T2都关联这个接口库即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:27:02