这个问题与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
在一个实例中未设置,并在另一个实例中设置?
答案 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
不会被其他命令改变,反之亦然。这会违反这些命令的范围。