在CMake中设置通用编译标志的现代方法是什么?
CMake提供了多种机制来获取编译器的标志:
-
CMAKE_<LANG>_FLAGS_<CONFIG>
variables -
add_compile_options
命令 -
set_target_properties
命令
在现代使用中,是否有一种方法比另一种方法更受欢迎? 如果是这样的话 另外,如何将这种方法用于多种configuration系统,如MSVC?
对于现代CMake(版本2.8.12及更高版本),您应该使用target_compile_options
,它在内部使用目标属性。
CMAKE_<LANG>_FLAGS
是一个全局variables,最容易出错。 它也不支持生成器expression式 ,这可能会非常方便。
add_compile_options
是基于目录属性的,在某些情况下是很好的,但通常不是指定选项的最自然的方法。
由于源文件的编译选项取决于文件属于哪个项目(而不是哪个目录),因此target_compile_options
以每个目标为基础(通过设置COMPILE_OPTIONS
和INTERFACE_COMPILE_OPTIONS
目标属性)工作,这通常会导致最COMPILE_OPTIONS
的CMake代码它被放置在硬盘上)。 这还有一个好处,就是如果有要求的话,它会自动处理相关目标的选项 。
即使它们稍微冗长一点,每个目标命令也允许对不同的构build选项进行相当细致的控制,并且(以我的个人经验),从长远来看最不可能引起头痛。
理论上讲,你也可以直接使用set_target_properties
设置各自的属性,但是target_compile_options
通常更具可读性。
例如,要根据使用生成器expression式的configuration来设置目标foo
的编译选项,您可以这样编写:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>") target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")