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

时间:2013-03-05 12:25:44

标签: c++ cmake

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

add_definitions

  

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

COMPILE_DEFINITIONS property on directories

  

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

COMPILE_DEFINITIONS property on targets

  

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

COMPILE_DEFINITIONS property on source files

  

COMPILE_DEFINITIONS:用于编译源文件的预处理器定义。

COMPILE_DEFINITIONSadd_definitions功能似乎重叠。 COMPILE_DEFINITIONS属性似乎更灵活。

所以似乎COMPILE_DEFINITIONS属性执行add_definitions所做的一切,甚至更多。

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

3 个答案:

答案 0 :(得分:36)

自从CMake的第一个版本在十多年前上线以来,

add_definitions已经存在于CMake中。

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

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

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

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

答案 1 :(得分:3)

我不是说必须使用。

这只是你习惯的问题。

一些建议:

  • 如果要添加到编译器命令行,请使用 add_definitions 对于当前目录及以下的源。它只是更短 类型。

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

答案 2 :(得分:1)

如果要添加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)

您也可以从此how to set multiple compile definitions for target executable看到问题https://cmake.org/cmake/help/v3.0/command/target_compile_definitions.html