在CMake文档中,我们可以阅读:
在当前目录及以下的源中为编译器命令行添加标志。
COMPILE_DEFINITIONS property on directories
COMPILE_DEFINITIONS:用于编译目录源的预处理器定义。
COMPILE_DEFINITIONS property on targets
COMPILE_DEFINITIONS:用于编译目标源的预处理器定义。
COMPILE_DEFINITIONS property on source files
COMPILE_DEFINITIONS:用于编译源文件的预处理器定义。
COMPILE_DEFINITIONS
和add_definitions
功能似乎重叠。 COMPILE_DEFINITIONS
属性似乎更灵活。
所以似乎COMPILE_DEFINITIONS属性执行add_definitions所做的一切,甚至更多。
那么,在哪些情况下必须我们调用add_definitions,因为不能使用COMPILE_DEFINITIONS属性?
答案 0 :(得分:36)
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。