__1符号来自何处使用LLVM的libc ++?

jww*_*jww 9 c++ symbols libstdc++ libc++

在IOS 64位项目中,我看到了大量的问题,如Apple Mach-O Linker(Id)错误cryptopp中的未定义符号.问题通常描述为:

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)
Run Code Online (Sandbox Code Playgroud)

问题通常会减少到混合/匹配-stdlib=libc++(LLVM C++运行时)和-stdlib=libstdc++(GNU C++运行时).LLVM的C++运行时(libc++)具有__1装饰符号,但GNU C++运行时libstdc++ 缺少__1在其名称符号.它会导致符号显示具有相同名称的链接器问题(如std::string).

__1使用LLVM的libc ++时,符号来自何处?

为什么这个问题不是一个解决gnu命名和llvm命名空间?


这是一个相关的问题:libc ++ - 停止std重命名为std :: __ 1?.但它有点忽略了重命名不会发生的重点.

Sev*_*eux 6

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

libc ++有类似的东西

namespace std {
    inline namespace __1 {
        ....
Run Code Online (Sandbox Code Playgroud)

更多内容什么是内联命名空间?

  • @jww我相信两个编译器(GCC和clang)都理解内联的namspaces.问题在于声明与定义.如果您正在使用libc ++头文件,您将获得使用`std :: __ 1 ::`前缀选择的声明,例如`std :: __ 1 :: string`等.如果您使用的是GNU libstdc ++标题,那么您将会获取声明`std :: string`等.但是你必须从libstdc ++.a/.so或libc ++.a/.so中获取定义.由于每个库都使用自己的头编译,因此定义也带有相同的前缀.未完待续... (2认同)
  • 因此,如果从libc ++头文件中选择声明(使用std :: __ 1 :: prefix)但是尝试使用libstdc ++(带有std ::前缀)的定义,则会出现链接器错误 - 定义并不多.好的,我认为,调试可能是一场噩梦.所以我想说如果你使用GNU工具链,链接libstdc ++,如果clang - 链接libc ++ (2认同)