问题描述
设置CMake目标的属性时,可以将其设置为PUBLIC
,INTERFACE
或PUBLIC
。但是-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()
命令,可以在某种程度上获得INTERFACE
或PUBLIC
对这些属性的影响(或者它是一个宏?我总是得到那些混合使用),其特征之一是:cxx_std_98
,cxx_std_11
等。因此,例如:
target_compile_features(mylib PUBLIC cxx_std_11)
,但这仍然不是问题中OP命令的确切PUBLIC
等效项:这不会阻止GNU扩展的可用性。所以,这是一个半解决方案-而且我也不喜欢它,因为问题中的语法更好。