我们不能混合使用g++和clang++编译的对象(或库)?至少在Mac上是这样

We can’t mix the objects (or libraries) compiled by g++ and clang++ ? at least on Mac?

本文关键字:Mac 或库 混合 不能 g++ 对象 编译 clang++ 我们      更新时间:2023-10-16

a function as

MyFunction(std::string) 

在Mac上用g++编译为:

__Z6MyFuncSs

MyFunction(std::string)

在clang++编译时,它是:

__Z6MyFuncNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE

demangled:

MyFunc(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)

在Linux上没有同样的问题
有人知道为什么吗?

编译器是兼容的,但它们的默认标准库不是。

在Linux上没有同样的问题有人知道为什么吗?

在GNU/Linux上,你可能使用clang + libstdc++,所以它与GCC + libstdc++兼容,因为它使用了与libstdc++相同的std::string定义。

在Mac OS X上,你使用的是clang + libc++,它与GCC + libstdc++不兼容,它们对std::string的定义不同,所以你得到了不同的名称。

一个选项是在Mac OS X上使用Clang编译时使用-stdlib=libstdc++,告诉它使用libstdc++,但是Mac OS X包含的libstdc++版本是古老的,不支持任何c++ 11。这样做也可能意味着您不能链接到使用c++标准库的其他本机Mac OS X库,因为它们可能不是用-stdlib=libstdc++

构建的。

c++标准要求有一种消除重载名称歧义的方法,但它将实际的方法留给了实现。大多数实现使用名称混淆来实现这一点,但它们有自己独特的方式。

底线是:不要期望任何两个编译器使用相同的名称混淆技术。即使是同一编译器的两个版本也可以改变(并且已经改变)它们执行名称混淆的方式。