LLVM C++ 和 GNU C++ 的标准库有不同 headers

Standard libraries of LLVM C++ and GNU C++ have different headers

我必须使用 unordered_maptrie,但不是一个标准库,也不是另一个包含它们的标准库。

// works only with LLVM library
#include <unordered_map>
// works only with GNU library
#include <ext/pb_ds/assoc_container.hpp>

我的意思是 GCC GNU website.

上有描述

该程序正在 Xcode 7.2.1 中构建。我尝试过使用 GNU C++14、GNU C++11 和 C++14、C++11,但没有用。

这个问题怎么解决?可能是我的 GNU 库太旧了,我可以在 Xcode 更新它吗?或者,也许 LLVM 有 assoc_container.hpp 是其他路径?

std::unordered_map 与 C++11 标准一起出现,并非所有编译器都使用 C++11(或更高版本)作为标准,但这意味着您必须在构建时添加标志才能使用它.

当使用 5.1 之前的 GCC 版本构建时,您应该添加标志 -std=c++11(如果您想要 GCC 扩展,则可以选择 -std=gnu++11,如果您有一个非常旧的版本,则可以添加 -std=c++0x海湾合作委员会)。

std::unordered_map 的实现是 C++11 的要求。这表明您使用的是 stdlibc++ 的旧版本。

如果您坚持使用该版本,Boost 提供了一个您可以使用的 implementation

您不能期望 libc++(Clang 的 C++ 库)具有 GNU 扩展。但是,您可以在同一个可执行文件(但不是编译单元)中混合和匹配 libstc++libc++,因为后者使用内联名称空间,这意味着它的符号不会与前者冲突.

编辑:

似乎 OP 正在使用最新版本的 clang 在 MacOSX 上编译。

在这种情况下,工具链附带的 libstd++ 是一个不支持 C++11 的旧版本。就 Apple 而言,它已被弃用。

最好的选择是:修改代码以避免在 libstdc++ 中使用扩展 - 在任何情况下这似乎都是 C++11 预发布功能 或者:使用两个库构建(是的,这在 MacOSX 和 iOS 上完全可行)。这里需要注意的是,您只能在任何编译单元中使用一个或另一个。