如何将CXX_STANDARD和相关属性传播到相关目标?

问题描述

设置CMake目标的属性时,可以将其设置为PUBLICINTERFACEPUBLIC。但是-CXX_STANDARD属性上的CMake手册page并不表示可以指定其中之一。具体来说,假设我有

set_target_properties(mylib PROPERTIES 
        CXX_STANDARD 11
        CXX_STANDARD_required YES
        CXX_EXTENSIONS NO
)

真的不可用吗?如果是这样,为什么?

(注意:此问题与C或CMake支持的任何语言都一样。)

解决方法

正如@Mizux在评论中指出的那样,目前您似乎无法使这些CXX_前缀的选项传播到相关目标:传播属性命名为INTERFACE_ +原始属性属性名称-截至2020年10月,master list of target properties中没有前缀为INTERFACE_CXX_的属性。

我不知道为什么会这样。

但是-通过使用target_compile_features()命令,可以在某种程度上获得INTERFACEPUBLIC对这些属性的影响(或者它是一个宏?我总是得到那些混合使用),其特征之一是:cxx_std_98cxx_std_11等。因此,例如:

target_compile_features(mylib PUBLIC cxx_std_11)

,但这仍然不是问题中OP命令的确切PUBLIC等效项:这不会阻止GNU扩展的可用性。所以,这是一个半解决方案-而且我也不喜欢它,因为问题中的语法更好。