我无法理解何时使用target_compile_definitions(...)
vs set(COMPILE_DEFINITIONS ...)
。 target_compile_definitions
只影响特定目标的区别是什么?
答案 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()
做什么以及属性是两个正交的东西。