【问题标题】:Difference between add_compile_options and SET(CMAKE_CXX_FLAGS...)add_compile_options 和 SET(CMAKE_CXX_FLAGS...) 之间的区别
【发布时间】:2017-01-22 21:52:41
【问题描述】:

这个问题与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 --version 返回cmake version 3.6.2
  • @usr1234567 - 是的,很抱歉这些问题。想要 CMake 的人没有维护它,所以现在责任落在了我身上。我对 CMake 几乎一无所知,因为我使用 GNUmake 并编写自己的 makefile。我遗憾接受了那些 CMake 补丁...是的,我会编辑问题。对此感到抱歉。

标签: cmake compiler-options


【解决方案1】:
  • CMAKE_CXX_FLAGS 用于为所有 C++ 目标添加标志。这很方便传递一般参数,如警告级别或选定的所需 C++ 标准。它对 C 或 Fortran 目标没有影响,用户可能会传递其他标志。

  • add_compile_options 将选项添加到目录及其子目录中的所有目标。如果您在目录中有一个库,并且您想为与该库相关但与所有其他目标无关的所有目标添加选项,这将很方便。此外,add_compile_options 可以处理带有 generator expressions 的参数。 documentation 明确指出,

此命令可用于添加任何选项,但替代命令 存在以添加预处理器定义(target_compile_definitions()add_definitions()) 或包含目录 (target_include_directories()include_directories())。

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

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

【讨论】:

  • 谢谢@usr1234567。在调用现场,当CMAKE_CXX_FLAGS 打印出message(STAUS, ...) 时,为什么CMake 没有产生与target_compile_definitionsadd_definitions 相加的值?为什么没有打印出来?
  • @jww:因为CMAKE_CXX_FLAGS 不会累积使用target_compile_definitionsadd_definitions 添加的值。 generator 形成编译器调用并收集其所有选项:来自变量CMAKE_CXX_FLAGSCMAKE_CXX_FLAGS_<CONFIG>、来自目标的属性COMPILE_DEFINITION 等等。
  • @jww:我添加了一段关于你的问题的段落。
  • 再次感谢@usr1234567。最后一个关于生成变量和生成器的问题......如果生成器不会产生值,那么如何处理instruct CMake to use accumulated flags during linking 之类的事情?
  • @jww:这是它自己的问题。
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 2016-03-26
  • 2016-03-02
  • 2012-04-25
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
相关资源
最近更新 更多