38

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

添加定义

为当前目录及以下目录中的源代码添加标志到编译器命令行。

目录上的 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 属性不能使用?

4

3 回答 3

43

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

COMPILE_DEFINITIONS只是更新、更灵活、更细粒度的方法。

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

所以:add_definitions主要用于配置预先存在的 CMakeLists 文件——对于那些自COMPILE_DEFINITIONS引入之前就已经存在的项目。而且,由于这些项目使用它,任何基于人们从阅读这些 CMakeLists 文件中学到的新项目也很有可能使用add_definitions.

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

于 2013-03-07T04:40:45.980 回答
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)

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

于 2018-07-09T01:15:39.260 回答
5

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

这只是你的习惯问题。

一些建议:

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

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

于 2013-03-05T18:22:39.110 回答