CMake提供了多种机制来获取编译器的标志:
现代使用中是否有一种方法优于另一种方法?如果是这样的话?此外,该方法如何与多个配置系统(如MSVC?
)一起使用答案 0 :(得分:76)
对于现代CMake(版本2.8.12及更高版本),您应该使用target_compile_options
,它在内部使用目标属性。
CMAKE_<LANG>_FLAGS
是一个全局变量,最容易出错。它也不支持generator expressions,它可以派上用场。
add_compile_options
基于目录属性,在某些情况下很好,但通常不是指定选项的最自然方式。
target_compile_options
在每个目标的基础上工作(通过设置COMPILE_OPTIONS
和INTERFACE_COMPILE_OPTIONS
目标属性),这通常会产生最干净的CMake代码,作为源的编译选项文件由文件所属的项目决定(而不是它放在硬盘上的目录)。如果需要,这还有一个额外的好处就是automatically takes care of passing options on依赖目标。
尽管它们更加冗长,但每个目标命令允许对不同的构建选项进行合理细粒度的控制,并且(根据我的个人经验)从长远来看最不可能导致头痛。
理论上,您还可以使用set_target_properties
直接设置相应的属性,但target_compile_options
通常更具可读性。
例如,要根据使用生成器表达式的配置设置目标foo
的编译选项,您可以编写:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
答案 1 :(得分:0)