【问题标题】:Standard libraries of LLVM C++ and GNU C++ have different headersLLVM C++ 和 GNU C++ 的标准库有不同的头文件
【发布时间】:2016-08-23 02:35:18
【问题描述】:

我必须使用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 是其他路径?

【问题讨论】:

  • 您可能想要更新您的 GNU stdlibc++。您可以为此使用 macports 或自制软件。

标签: c++ xcode llvm gnu c++-standard-library


【解决方案1】:

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

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

【讨论】:

  • @AivanF。然后请编辑您的问题,向我们展示您是如何构建程序的、您拥有哪些标志、您拥有哪些 IDE 项目设置。
  • 请运行gcc --version,以便我们查看您的内容。相同的选项适用于 clang。
  • @marko 它说:Apple LLVM 版本 7.0.2 (clang-700.1.81) 目标:x86_64-apple-darwin14.5.0 线程模型:posix
  • gcc 在 OS X 上是指向clang的符号链接
  • 好的。您正在使用 MacOSX。如果您使用的是 libstdc++,那么它会停留在不支持 C++11 的旧版本上——我相信是出于许可原因。就 Apple 而言,libstdc++ 在 MacOSX 上的使用已被弃用。
【解决方案2】:

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 上是完全可能的)。这里需要注意的是,您只能在任何编译单元中使用其中一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2016-02-17
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多