在CMake中设置通用编译标志的现代方法是什么?

时间:2014-06-02 12:53:02

标签: cmake

CMake提供了多种机制来获取编译器的标志:

现代使用中是否有一种方法优于另一种方法?如果是这样的话?此外,该方法如何与多个配置系统(如MSVC?

)一起使用

2 个答案:

答案 0 :(得分:76)

对于现代CMake(版本2.8.12及更高版本),您应该使用target_compile_options,它在内部使用目标属性。

CMAKE_<LANG>_FLAGS是一个全局变量,最容易出错。它也不支持generator expressions,它可以派上用场。

add_compile_options基于目录属性,在某些情况下很好,但通常不是指定选项的最自然方式。

target_compile_options在每个目标的基础上工作(通过设置COMPILE_OPTIONSINTERFACE_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)

这三种方式具有不同的用途,因此通常没有一种方法比其他方法更可取。 CMAKE_<LANG>_FLAGS是用户在为项目调用CMake时可以定义以传递标志的变量。其他两个在项目中使用。一个用于为特定目标设置标志,另一个用于整个目录或生成器表达式。

相关问题:enter image description here