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

时间:2014-08-12 14:09:30

标签: c++ compilation g++ clang++

函数

MyFunction(std::string) 

在Mac上用g ++编译为:

__Z6MyFuncSs

解读为:

MyFunction(std::string)

使用clang ++编译时,它是:

__Z6MyFuncNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE

解读为:

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

在Linux上没有相同的问题 有谁知道为什么?

2 个答案:

答案 0 :(得分:6)

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

  

在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++构建的

答案 1 :(得分:0)

C ++标准要求有一种方法来消除重载名称的歧义,但它留下实际的方法来实现。大多数实现使用名称修改来实现这一点,但是以他们自己独特的方式执行。

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