CMake:何时使用 add_definitions 而不是 set_target_properties(目标属性COM
CMake: when to use add_definitions instead of set_target_properties(target PROPERTIES COMPILE_DEFINITIONS definitions)
在CMake文档中,我们可以阅读:
add_definitions
将当前目录及以下目录中的源代码的标志添加到编译器命令行。
目录上的COMPILE_DEFINITIONS属性
COMPILE_DEFINITIONS:用于编译目录源代码的预处理器定义。
COMPILE_DEFINITIONS目标的属性
COMPILE_DEFINITIONS:用于编译目标源的预处理器定义。
源文件COMPILE_DEFINITIONS属性
COMPILE_DEFINITIONS:用于编译源文件的预处理器定义。
COMPILE_DEFINITIONS
和add_definitions
功能似乎重叠。 COMPILE_DEFINITIONS
属性似乎更灵活。
因此,似乎COMPILE_DEFINITIONS财产可以做add_definitions所做的一切,甚至更多。
那么,在哪些情况下,我们必须调用add_definitions COMPILE_DEFINITIONS因为无法使用财产?
十多年前CMake的第一个版本上线以来,add_definitions
就一直存在于CMake中。
COMPILE_DEFINITIONS
只是更新、更灵活和更细粒度的方法。
它们将永远存在:由于世界上 99%+ 的现有 CMakeLists.txt
文件都使用 add_definitions
,删除它根本不明智。CMake 开发人员非常努力地保持向后兼容性......有时损害清晰和简单。有时以多种不同的方式做本质上相同的事情。
因此:add_definitions
主要用于配置预先存在的CMakeLists文件 - 对于那些在引入COMPILE_DEFINITIONS
之前就已经存在的项目。而且,由于这些项目使用它,任何基于人们从阅读这些CMakeList文件中学到的知识的新项目也很可能使用add_definitions
。
但是,如果单独使用COMPILE_DEFINITIONS
就足以满足您的需求,那肯定没有错。
如果要添加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 中看到此问题如何为目标可执行文件设置多个编译定义以获取更多信息。
我并不是说必须使用某些东西。
这只是你的习惯问题。
一些建议:
-
当您想要添加到编译器命令行时,请使用add_definitions对于当前目录及以下目录中的源。它只是更短到类型。
-
使用COMPILE_DEFINITIONS对目标或特定目标进行微调来源。
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>