add_compile_options和SET之间的区别(CMAKE_CXX_FLAGS ...)

时间:2016-09-15 00:20:47

标签: 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:

SET 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在一个实例中未设置,并在另一个实例中设置?

1 个答案:

答案 0 :(得分:23)

  • 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不会被其他命令改变,反之亦然。这会违反这些命令的范围。