CMake make 库需要 cxx 标准
Posted
技术标签:
【中文标题】CMake make 库需要 cxx 标准【英文标题】:CMake make library require cxx standard 【发布时间】:2017-10-05 19:34:12 【问题描述】:我尝试让我的库目标依赖于 c++14。我怎样才能实现,链接到我的库目标的目标也依赖于 c++14?
我尝试使用:
add_library(lib SHARED $FILES)
target_compile_options(lib INTERFACE CXX_STANDARD 14)
这可以构建库,但是当我尝试使用 lib
编译其他目标时,C++14 没有被激活。
我知道,还有其他方法,但我无法让它们发挥作用。即有:
set_target_properties()
原因是,库头文件使用了通用的 lambda 捕获和模板别名,如 std::remove_reference_t
和类似的,自 c++14 以来就在标准库中。
【问题讨论】:
因此,如果其他目标使用该库,它们实际上也在使用 c++14。那么直接在它们上指定 c++ 标准怎么样?如果仅仅使用库有改变程序使用的语言的副作用,那就太奇怪了。 这就是我目前所做的,但我认为在最近的cmake
版本中有更优雅的方式。 cuda 和 mpi 目标设法自动设置多个标志。
您的库中有用户编译的 .h 或 hpp 文件。在那里检查所需的兼容性级别。
@ddbug 兼容性级别是什么意思?
【参考方案1】:
您要查找的内容(CMake 版本 >= 3.8)如下:
target_compile_features(lib PUBLIC cxx_std_14)
或者,对于 3.1 以上的 CMake 版本,通过明确指定您需要的功能,f.i.:
target_compile_features(lib PUBLIC cxx_alias_templates)
您使用的语法不正确,无法设置所需的标准。附带说明一下,使用PUBLIC
代替INTERFACE
,因为您也想用C++14 编译库本身。
更多详情请关注docs。
【讨论】:
看起来他需要这个和他现有的 CMake,因为他的代码似乎正在使用CXX_STANDARD
有条件地编译代码变体。以上是关于CMake make 库需要 cxx 标准的主要内容,如果未能解决你的问题,请参考以下文章