CMake:何时使用 add_definitions 而不是 set_target_properties(目标属性COM

CMake: when to use add_definitions instead of set_target_properties(target PROPERTIES COMPILE_DEFINITIONS definitions)

本文关键字:properties set target COM 属性 目标 何时使 add definitions CMake      更新时间:2023-10-16

在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因为无法使用财产?

自从

十多年前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对目标或特定目标进行微调来源。