cmake - add_compile_options 和 SET(CMAKE_CXX_FLAGS...) 的区别

标签 cmake compiler-options

这个问题与Instruct Cmake to use CXX and CXXFLAGS when driving link?有关在前一个问题中,我们试图指示 CMake 使用 CXXFLAGS当它调用链接器时。

add_compile_options

我们发现下面的代码

if (CMAKE_VERSION VERSION_LESS 2.8.12)
    add_definitions(-foo)
else()
    add_compile_options(-foo)
endif()

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")

产生输出
CXXFLAGS:

设置 CMAKE_CXX_FLAGS

我们发现下面的代码
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -foo" )

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")

产生输出
CXXFLAGS: -foo

问题

我们发现 CMake 会使用 -foo 创建目标文件在这两种情况下。所以-foo肯定会进入 CXXFLAGS .

第一组 CMake 代码和第二组 CMake 代码有什么区别?

为什么是 CMAKE_CXX_FLAGS在一个实例中取消设置,并在另一个实例中设置?

最佳答案

  • CMAKE_CXX_FLAGS用于为所有 C++ 目标添加标志。这对于传递一般参数(如警告级别)或选定的所需 C++ 标准非常方便。它对 C 或 Fortran 目标没有影响,用户可能会传递额外的标志。
  • add_compile_options将选项添加到目录及其子目录中的所有目标。如果您在目录中有一个库,并且您想向与该库相关但与所有其他目标无关的所有目标添加选项,这将非常方便。此外,add_compile_options可以用 generator expressions 处理参数. documentation明确指出,

  • This command can be used to add any options, but alternative commands exist to add preprocessor definitions (target_compile_definitions() and add_definitions()) or include directories (target_include_directories() and include_directories()).


  • add_definitions旨在传递 -DFOO -DBAR=32 类型的预处理器值( /D 在 Windows 上)定义和设置预处理器变量。您可以传递任何标志,但检测上述形式的标志并将其添加到 [COMPILE_DEFINITIONS][2]属性,您可以稍后阅读和更改。在这里,您也可以使用生成器表达式。 documentation提到了目录、目标和源文件的范围。

  • 对于给定的目标,CMake 将从 CMAKE_CXX_FLAGS 收集所有标志,目标和目录的 COMPILE_DEFINITIONS来自所有 add_compile_options从而影响目标。CMAKE_CXX_FLAGS不会被其他命令改变,反之亦然。这将违反这些命令的范围。

    关于cmake - add_compile_options 和 SET(CMAKE_CXX_FLAGS...) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39501481/

    相关文章:

    typescript - 在 Typescript 中使用 '--strictFunctionTypes' 有什么好处?

    c++ - 使用cmake的Linux终端上的“Conversion to non-scalar type is requested”错误

    cmake - 如何使用 CMake + msbuild 构建所有配置

    c++ - CMAKE、SDL2 和 OPENGL : Program binary is too big

    linux - `Cmake` 在调用 `target_link_libraries(target_name, library_name_without_postfix)` 时更喜欢链接到哪个库?

    gcc - 可以为 clang 或 gcc 配置 constexpr 递归限制吗?

    c++ - 如何在 MSVC 中创建 WT 项目?

    node.js - 如何找到任何版本 Node 的最新 Typescript 目标支持?

    c++ - 如果同时指定 EHsc 和 EHa 会发生什么

    build - 有效值有限的CMake变量