已接受的answer 仍在工作,但自 2013 年以来已过时。
此答案基于 CMake v2.8.12、v3.3 和 v3.13 中的新功能。
自 CMake-2.8.12 (2013) 起
设置CMAKE_CXX_FLAGS的两个新命令:
上一版本的文档自cmake-2.8.12以来没有太大变化:
在你的情况下,你可以使用:
target_compile_options(${TARGET} PRIVATE ${BUILD_FLAGS})
或者只是如果你有一个单一的目标:
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
已弃用 COMPILE_FLAGS
cmake-3.0 documentation 将 COMPILE_FLAGS 标记为已弃用:
COMPILE_FLAGS
编译此目标的源代码时要使用的其他标志。
COMPILE_FLAGS 属性设置额外的编译器标志,用于
在目标中构建源。使用COMPILE_DEFINITIONS 传递
额外的预处理器定义。
此属性已弃用。使用 COMPILE_OPTIONS 属性或
改为target_compile_options 命令。
如果您仍想使用set_target_properties(),您可以使用COMPILE_OPTIONS 而不是COMPILE_FLAGS:
set_target_properties(${TARGET} PROPERTIES COMPILE_OPTIONS ${BUILD_FLAGS})
自 CMake-3.3 (2015) 起
Anton Petrov 建议使用generator expressions,如answer of ar31 中所示。
CMake 生成器表达式 将您的${BUILD_FLAGS} 应用于:
- C++ 语言使用
$<COMPILE_LANGUAGE:CXX>(也可以是C、CUDA...)
- 使用
$<CXX_COMPILER_ID:Clang>的Clang编译器
(对于gcc,也可以是GNU,对于Visual C++,也可以是MSVC...参见full list)
(如果语言是 C,请改用 $<C_COMPILER_ID:Clang>)
- 以及更多支持的 C++ 功能或编译器版本...(请参阅documentation)
在你的情况下,你可以使用:
target_compile_options(${TARGET} PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:${BUILD_FLAGS_FOR_CXX}>
$<$<COMPILE_LANGUAGE:C>:${BUILD_FLAGS_FOR_C}>)
或关于编译器:
target_compile_options(${TARGET} PRIVATE
$<$<CXX_COMPILER_ID:Clang>:${BUILD_FLAGS_FOR_CLANG}>
$<$<CXX_COMPILER_ID:GNU>:${BUILD_FLAGS_FOR_GCC}>
$<$<CXX_COMPILER_ID:MSVC>:${BUILD_FLAGS_FOR_VISUAL}>)
自 CMake-3.13 (2018) 起
Craig Scott 提到的新函数 target_link_options() 允许将选项传递给链接器。
C 和 C++ 文件的不同选项
最好的方法是使用两个不同的目标来区分 C 文件和 C++ 文件。