CMake中的set_target_properties是否覆盖CMAKE_CXX_FLAGS?

在我的CMake项目开始时,我在variablesCMAKE_CXX_FLAGS中设置常规编译标志,就像

set(CMAKE_CXX_FLAGS "-W -Wall ${CMAKE_CXX_FLAGS}") 

稍后,我需要附加其他特定于configuration的编译标志(存储在BUILD_FLAGS中)。 我可以使用以下命令:

 set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS}) 

或者我必须手动添加CMAKE_CXX_FLAGS:

 set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BUILD_FLAGS}") 

防止CMAKE_CXX_FLAGS被BUILD_FLAGS覆盖?

使用第一个:

 set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS}) 

在编译TARGET的源代码时,存储在BUILD_FLAGS中的标志被附加在CMAKE_CXX_FLAGS之后。 文档暗示了这一点,但我只是试图确保。

COMPILE_FLAGS

  Additional flags to use when compiling this target's sources. The COMPILE_FLAGS property sets additional compiler flags used to build sources within the target. Use COMPILE_DEFINITIONS to pass additional preprocessor definitions. 

完整的命令行将相当于:

 ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} -o foo.o -c foo.cc 

而拉蒙说,你可以随时检查make VERBOSE=1

richq的答案仍然有效,但自2013年以来有点过时了。我的答案是更新。

cmake-2.8.12开始,可以使用命令target_compile_options()add_compile_options()

 # In you case you can use target_compile_options(${TARGET} PRIVATE ${BUILD_FLAGS}) # or simply (if you have a single target) add_compile_options(${BUILD_FLAGS}) 

更多的例子

 target_compile_options(mylib PRIVATE -O2) # only internal target_compile_options(mylib INTERFACE -gl) # only external target_compile_options(mylib PUBLIC -g) # same as PRIVATE + INTERFACE # multiple targets and flags target_compile_options(mylib1 mylib2 PRIVATE -Wall -Wextra) target_compile_options( mylib PUBLIC -DUSEXX) # Bad target_compile_definitions(mylib PUBLIC -DUSEXX) # OK add_compile_options(-Wall -Wextra) # for all targets in current directory add_compile_options(-DUSEXX) # Bad add_definitions(-DUSEXX) # OK 

cmake-2.8.12开始, cmake-3.2文档或多或less一样:

  • target_compile_options()
  • add_compile_options()

注意在cmake-3.0文档中 COMPILE_FLAGS被标记为不推荐使用:

COMPILE_FLAGS

编译此目标源时使用的其他标志。

COMPILE_FLAGS属性设置额外的编译器标志,用于在目标中构build源代码。 使用COMPILE_DEFINITIONS来传递额外的预处理器定义。

此属性已被弃用。 改用COMPILE_OPTIONS属性或target_compile_options命令。

如果你仍然想使用set_target_properties()你可以使用COMPILE_OPTIONS而不是COMPILE_FLAGS

 set_target_properties(${TARGET} PROPERTIES COMPILE_OPTIONS ${BUILD_FLAGS})