CMake:何时使用add_definitions而不是set_target_properties(目标PROPERTIES COMPILE_DEFINITIONS定义)

Kor*_*idu 30 c++ cmake

在CMake文档中,我们可以阅读:

add_definitions

在当前目录及以下的源中为编译器命令行添加标志.

目录上的COMPILE_DEFINITIONS属性

COMPILE_DEFINITIONS:用于编译目录源的预处理器定义.

目标上的COMPILE_DEFINITIONS属性

COMPILE_DEFINITIONS:用于编译目标源的预处理器定义.

源文件上的COMPILE_DEFINITIONS属性

COMPILE_DEFINITIONS:用于编译源文件的预处理程序定义.

COMPILE_DEFINITIONSadd_definitions功能似乎重叠.COMPILE_DEFINITIONS财产似乎更灵活.

因此,似乎COMPILE_DEFINITIONS属性可以执行add_definitions所做的一切,甚至更多.

那么,在哪些情况下我们必须调用add_definitions因为COMPILE_DEFINITIONS属性不能使用?

DLR*_*ave 38

自从CMake的第一个版本在十多年前上线以来,在CMake中已经存在add_definitions.

COMPILE_DEFINITIONS只是更新,更灵活,更细粒度的方法.

它们将永远都存在:由于世界上99%以上的现有CMakeLists文件都使用add_definitions,因此删除它是不明智的.CMake开发人员非常努力地保持向后兼容性......有时会损害清晰度和简单性.有时以多种不同的方式做同样的事情.

因此:add_definitions主要用于配置预先存在的CMakeLists文件 - 适用于自引入COMPILE_DEFINITIONS之前就已存在的项目.而且,由于这些项目使用它,任何基于人们从阅读CMakeLists文件中学到的东西的新项目也很可能使用add_definitions.

但如果单独使用COMPILE_DEFINITIONS足以满足您的需求,那肯定没有错.

  • 你能解释一下怎么知道这个吗?这是在文档中的某个地方吗?要了解CMake的奥秘,需要阅读什么? (8认同)

Jay*_*llo 6

如果要添加compile definition for target,可以使用这个功能target_compile_definitions哪个更方便?喜欢添加多个compile definitions一次,例如:

add_executable (trie_io_test demo12.cpp)
target_compile_definitions(trie_io_test PRIVATE UNIT_TESTING=1 IO_TEST=1)
Run Code Online (Sandbox Code Playgroud)

您也可以从这个https://cmake.org/cmake/help/v3.0/command/target_compile_definitions.html看到这个问题如何为目标可执行文件设置多个编译定义以获取更多信息。


Ser*_*lov 5

我不是说必须使用某些东西。

这只是你的习惯问题。

一些建议:

  • 当您想为当前目录及以下目录中的源添加到编译器命令行时,请使用add_definitions。打字时间更短。

  • 使用COMPILE_DEFINITIONS对目标或特定源进行微调。