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

标签 c++ cmake

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

add_definitions

Adds flags to the compiler command line for sources in the current directory and below.

COMPILE_DEFINITIONS property on directories

COMPILE_DEFINITIONS: Preprocessor definitions for compiling a directory's sources.

COMPILE_DEFINITIONS property on targets

COMPILE_DEFINITIONS: Preprocessor definitions for compiling a target's sources.

COMPILE_DEFINITIONS property on source files

COMPILE_DEFINITIONS: Preprocessor definitions for compiling a source file.

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

所以看来 COMPILE_DEFINITIONS 属性完成了 add_definitions 所做的一切,甚至更多。

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

最佳答案

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

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

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

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

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

关于c++ - CMake:何时使用 add_definitions 而不是 set_target_properties(目标 PROPERTIES COMPILE_DEFINITIONS 定义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15223779/

相关文章:

c - 带有 Json-C 的架构 x86_64 的 undefined symbol

CMake:如何获取安装规则的目标位置

c++ - 如何正确使用 intptr 将 char* 值从 C++ DLL 返回到 Vb.net

c++ - 如何创建继承自 Release 的 CMake 配置类型

c++ - PkgConfig 模块 : INCLUDE_DIRS not listing all directories

cmake - 如何告诉 CMake 链接到源目录中的静态库?

c++ - g++ 在编译时走得太远

c++ - 收到 BUILD_FAIL 错误

C++:使用 boost::regex 将管道分隔的字符串与通配符匹配

c++ - 使用 asio 独立头文件库