这个问题与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()
andadd_definitions()
) or include directories (target_include_directories()
andinclude_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/