C++17 std::variant头文件(clang 6.0.0)

8

更新

我把问题缩小到了 (可能是这个原因!尽管我已经阅读了关于这个主题的所有内容,但还不完全清楚) 安装 stdlibc++-7-dev 将为我提供合适的 (即符合 C++17 标准的) STL 头文件和库。

这也似乎与 Ubuntu 17.04 (artful?) 绑定在一起,但不可用于我使用的 xenial (Ubuntu 16.04.3 LTS)。

我尝试下载单独的 .deb 包并安装它们,但很快变成了一个无法解决的依赖项迷宫。

如果有人能指导我如何在 16.04 上安装 libstdc++-7-dev,我将非常感激。

原始问题

我刚刚通过包管理器在 Ubuntu 16.04 中安装了 clang++ 6.0 (遵循这些说明),看起来一切都很好:/usr/bin/clang++-6.0 可以正常工作,并且如果我尝试使用仅在 C++17 中工作的东西 (non-type template arguments with auto,请参见这里),只要我设置 CMAKE_CXX_COMPILER=/usr/bin/clang++-6.0,它就可以编译和运行 -- 而在我不设置时则会失败。

所以... clang 6.0 如其广告所述理解 C++17,但是当我使用:

#include <variant>

文件没有在我预期的位置找到:

$ ll /usr/include/clang/6.0.0/
total 0
lrwxrwxrwx 1 root root 45 Aug  6 21:32 include -> ../../../lib/llvm-6.0/lib/clang/6.0.0/include

或者任何我能想到的地方。

有人知道(a)它是否应该在那里,以及(b)如果是这样,我去哪里找到它?

更新

我已经双重检查了我是否拥有最新的stdc++库:

$ sudo apt-get install libstdc++-5-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libstdc++-5-dev is already the newest version (5.4.0-6ubuntu1~16.04.4).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

同样的,libstdc++-6-dev也是如此;此外,我还有libc++-dev

$ sudo apt-get install libc++-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libc++-dev is already the newest version (3.7.0-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

然而,variant.h*文件仍无法找到。还有其他什么我应该尝试吗?


尝试在编译器和链接器中都添加“-stdlib=libc++”。 - KayEss
一些部分已经得到支持,但仍在 c++1z 标志下(我不希望这会改变,直到标准被批准)。我认为他们已经在开发中切换到了6,因为他们正准备发布5。 - KayEss
Clang是一个编译器。标准库是独立的。 - T.C.
1
@kim366 刚刚发现了这个页面:http://en.cppreference.com/w/cpp/compiler_support 看起来clang-4支持大多数功能,但有几个只在5中才出现。 - Marco Massenzio
1
无论如何,也许尝试包含<experimental/variant>。这就是我在更新编译器之前使用<optional>的方法。 - Post Self
显示剩余9条评论
1个回答

3
是的,clang 5.0(或者更确切地说,将作为clang 5一部分发布的libc++)有头文件。但是您需要确保已安装libc++。
正如@KayEss所提到的,您需要传递-std = c ++ 17(或相同标志的早期版本-std = c ++ 1z),因为variant是仅C ++ 17支持的功能。

1
请问“你需要确保已安装libc++”这部分能否详细说明一下?我已经安装了clang++-6包(并验证它可以正常工作),以及其他由apt-get“建议”的软件包:但是,当我查看要安装的libstdc++软件包时,我没有看到任何明显要安装的内容。 (是的,我已经使用了--std=c++17标志-但编译会失败:缺少头文件) - Marco Massenzio
2
当你在Ubuntu上安装clang时,它已经设置好使用已安装的C++标准库(libstdc++)。这很有帮助,因为这意味着你可以“混合和匹配”使用gcc和clang编译的目标文件。你还需要安装libcxx包(例如:https://launchpad.net/ubuntu/+source/libc%2B%2B),并将`-std=libc++`传递给clang。 - Marshall Clow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接