自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)
target_compile_options(mylib INTERFACE -gl)
target_compile_options(mylib PUBLIC -g)
target_compile_options(mylib1 mylib2 PRIVATE -Wall -Wextra)
target_compile_options( mylib PUBLIC -DUSEXX)
target_compile_definitions(mylib PUBLIC -DUSEXX)
add_compile_options(-Wall -Wextra)
add_compile_options(-DUSEXX)
add_definitions(-DUSEXX)
弃用的COMPILE_FLAGS
cmake-3.0文档将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 建议使用 生成器表达式,正如 ar31 的回答中所介绍的。
CMake 的 生成器表达式 可以将你的 ${BUILD_FLAGS}
应用于:
- 使用
$<COMPILE_LANGUAGE:CXX>
(也可以是 C
、CUDA
等)的 C++ 语言
- 使用
$<CXX_COMPILER_ID:Clang>
的 Clang 编译器
(也可以是 gcc
的 GNU
或 Visual C++ 的 MSVC
等,请参见完整列表)
(如果语言为 C,请改用 $<C_COMPILER_ID:Clang>
)
- 以及更多的 支持的 C++ 特性 或 编译器版本...(请参见文档)
在你的情况下,你可以使用:
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)以来
一个新的函数target_link_options()
允许向链接器传递选项,正如Craig Scott所提到的。
C和C++文件使用不同的选项
最好的方法是区分C文件和C++文件,使用两个不同的目标。