【问题标题】:Does clang6 implement std::optional?clang6 是否实现 std::optional?
【发布时间】:2017-11-20 16:44:09
【问题描述】:

我想使用 C++17 std::optional 但在 clang 中似乎没有:

> cat test.cxx 
#include <optional>

int main(int, char **) {
    return 0;
}
> $CXX --version | head -n1
clang version 6.0.0 (trunk 317775)
> $CXX -std=c++17 test.cxx 
test.cxx:1:10: fatal error: 'optional' file not found
#include <optional>
         ^~~~~~~~~~
1 error generated.

如您所见,我使用的是相当新的 clang 版本,据我所知,clang 6 应该具有完整的 C++17 支持。乍一看,这似乎是一个问题,特别是因为包含 &lt;experimental/optional&gt; 工作正常,但也许是我错过了一些东西。你有什么想法吗?

谢谢

【问题讨论】:

  • 你也在使用最新的 GCC 的 linux 吗?我认为 linux 上的 clang 使用 GCC 标准库。因此,要在 linux 上将 Clang 与 C++17 一起使用,请确保您拥有最新的 libstdcpp。如果可以的话,考虑使用 clang 的 libc++。
  • clang 只是编译器。您缺少的是标准库的更新版本。
  • 感谢两位的澄清。所以解决办法是用自己的libc++(重新)编译clang?
  • 不是用 libcxx 构建 LLVM/Clang,在 llvm/projects 签出,是进行此升级的一种方法吗?
  • @Rakete1111,在树中使用 libcxx 构建 LLVM 并不意味着使用 std::lib 来编译 clang,这意味着 libc++ 将与 Clang 一起安装,因此可以与它一起使用(只需正如avitase所说)。

标签: c++ clang stdoptional


【解决方案1】:

正如 cmets 中所指出的,Clang 可能默认使用系统的 libstdc++ 标头,而您系统的 libstdc++ 太旧,无法支持 C++17。

要么安装较新的 GCC(带有较新的 libstdc++),然后使用 --gcc-toolchain=/path/to/new/gcc 选项告诉 Clang 如何找到它,或者在 Clang 旁边安装 libc++ 并告诉它使用带有 -stdlib=libc++ 选项的 libc++。

如果您选择安装更新的 libstdc++,那么您至少需要 GCC 7.1,这是第一个提供 &lt;optional&gt; 的版本。

【讨论】:

  • 或者针对新的 gcc 工具链编译 clang(花了我整个周末 to figure out how...)
猜你喜欢
  • 2014-11-08
  • 1970-01-01
  • 2019-02-19
  • 2013-06-05
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多