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

jww*_*jww 22 cmake compiler-options

这个问题与Instruct Cmake在驾驶链接时使用CXX和CXXFLAGS有关吗?在前一个问题中,我们试图指示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}")
Run Code Online (Sandbox Code Playgroud)

产生输出

CXXFLAGS:
Run Code Online (Sandbox Code Playgroud)

SET CMAKE_CXX_FLAGS

我们发现以下代码

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -foo" )

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")
Run Code Online (Sandbox Code Playgroud)

产生输出

CXXFLAGS: -foo
Run Code Online (Sandbox Code Playgroud)

问题

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

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

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

usr*_*567 26

  • CMAKE_CXX_FLAGS用于为所有C++目标添加标志.通过警告级别或选定的必需C++标准等一般参数,这很方便.它对C或Fortran目标没有影响,用户可能会传递其他标志.

  • add_compile_options将选项添加到目录及其子目录中的所有目标.如果您在目录中有一个库并且想要向与库相关的所有目标添加选项,但与所有其他目标无关,则这很方便.另外,add_compile_options可以使用生成器表达式处理参数.该文件明确规定,即

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

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

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

  • @jww:因为`CMAKE_CXX_FLAGS` 不会累积使用`target_compile_definitions` 和`add_definitions` 添加的值。*generator* 形成编译器调用并收集其所有选项:来自变量`CMAKE_CXX_FLAGS`、`CMAKE_CXX_FLAGS_<CONFIG>`、来自目标的属性`COMPILE_DEFINITION` 等等。 (2认同)