在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_OPTIONSINTERFACE_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}>")