我们不能混合使用g++和clang++编译的对象(或库)?至少在Mac上是这样
We can’t mix the objects (or libraries) compiled by g++ and clang++ ? at least on Mac?
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++标准要求有一种消除重载名称歧义的方法,但它将实际的方法留给了实现。大多数实现使用名称混淆来实现这一点,但它们有自己独特的方式。
底线是:不要期望任何两个编译器使用相同的名称混淆技术。即使是同一编译器的两个版本也可以改变(并且已经改变)它们执行名称混淆的方式。
相关文章:
- 如何在 Mac 上使用 c++17 并行标准库算法?
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 在C++库中,谁应该删除指针、用户或库?
- Cmake Mac OSX库链接问题:在Linux上进行编译,但在Mac上进行了编译
- 用于共享常量的头文件或库
- 如何替换源代码或库中的__ieee754_exp_avx调用
- C++:多个声音,没有额外的标题或库
- 将SmartFusion板连接到Mac或Linux
- 如何在不使用任何框架或库的情况下在屏幕上绘制图形
- 是在Mac上使用libc ++或libstdc++构建的库
- 2 升至 N 次幂,无需任何循环或递归或库函数
- 在我的Mac或PC上运行斯坦福CS107分配文件失败,帮助~
- 我们不能混合使用g++和clang++编译的对象(或库)?至少在Mac上是这样
- c++或库中是否存在null std::ostream实现?
- c++中是否有任何数据结构或库可以像Python列表和字典一样工作?
- 记录opengl视频没有单独的程序或库
- ColorF:什么头文件或库定义了ColorF
- 目标c-Mac(或c++)到二进制WCF的连接
- 如何在每个系统或库函数调用时使 GDB 中断
- 来自 EPEL 的 Amazon Linux 上的 Clang 找不到C++标头或库