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})