gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:24:44 32 4
gpt4 key购买 nike

这个问题与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/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com