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