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 标准的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CMake 自动链接 boost 库

命名空间“std”中没有名为“make_unique”的成员

在 CMake 中添加多个可执行文件

cmake 常见问题

使用cmake/make打包Android 动态库

CLion不承认项目为C ++ 14