使用LLVM的libc++时,__1符号从何而来?

Where does the __1 symbol come from when using LLVM's libc++?

我看到了很多像 Apple Mach-O Linker (Id) Error and 这样的问题。问题通常描述为:

Undefined symbols for architecture i386:
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
      cv::gpu::error(char const*, char const*, int, char const*) in opencv2(gpumat.o)

问题通常会简化为 mixing/matching -stdlib=libc++(LLVM C++ 运行时)和 -stdlib=libstdc++(GNU C++ 运行时)。 LLVM C++运行时(libc++)有一个__1装饰符号,但是GNU C++运行时libstdc++缺少中的__1符号其名称。对于看起来具有相同名称(如 std::string)的符号,它会导致链接器问题。

使用LLVM的libc++时,__1符号从何而来?

为什么 没有 使用 gnu 命名空间和 llvm 命名空间解决问题?


这是一个相关问题:libc++ - stop std renaming to std::__1?。但它有点忽略了重命名不会发生的要点。

它来自 C++11 内联命名空间

libc++ 有类似的东西

namespace std {
    inline namespace __1 {
        ....

更多信息在 What are inline namespaces for?