我何时使用target_compile_definitions(...)vs set(COMPILE_DEFINITIONS ...)

时间:2017-12-01 05:08:16

标签: cmake

我无法理解何时使用target_compile_definitions(...) vs set(COMPILE_DEFINITIONS ...)target_compile_definitions只影响特定目标的区别是什么?

1 个答案:

答案 0 :(得分:1)

要认识到的一点是,set(COMPILE_DEFINITIONS ...)不会以任何方式改变任何目标。

这是什么意思?好吧,您只需创建一个新变量(称为COMPILE_OPTIONS),该变量将在第一次配置运行后进行缓存。这就是全部。没有其他事情发生。

现在,接下来要意识到存在属性 ,这就是你的意思。属性是一些不同的" context"," payload"对于目标,目录,源文件等,Documentation表示存在:

  • 全球范围的属性
  • 目录属性
  • 目标属性
  • 测试中的属性
  • 源文件上的属性
  • 缓存条目的属性
  • 已安装文件的属性

文档还说COMPILE_DEFINITIONS是目录范围和目标范围都存在的属性。这意味着您拥有的每个目录和您声明的每个目标都具有此属性,并且每个目录的属性值都可以不同。一个使用set_property()为所需范围设置属性。

现在,target_compile_definitions()是什么?这相当于set_property(TARGET ... PROPERTY COMPILE_DEFINITIONS ...)

因此,实质上,所有这些target_函数都只是这样做,但它具有独特的功能。但是,CMake没有针对每个属性的功能,所以再次遇到一些不一致的问题。

但是,请记住set()做什么以及属性是两个正交的东西。