混合编译器 >强>我想知道是否可以将编译的GCcc4.2的C++程序与共享的C++库链接,该库在GC4.5的后期版本中编译。< /强>

混合编译器 >强>我想知道是否可以将编译的GCcc4.2的C++程序与共享的C++库链接,该库在GC4.5的后期版本中编译。< /强> ,c++,gcc,dynamic-linking,C++,Gcc,Dynamic Linking,我试过这样做,但遇到了一些不同的问题。 编译共享库gcc5.3时,我收到一条消息说: *“malloc:对象0x7fff707d2500的错误:未分配要释放的指针。” 在malloc\u error\u break中设置断点以调试“*” 如果我尝试用gcc4.6编译共享库,我会得到非常奇怪的行为。std::stringstream类工作不正常。写入流后,结果字符串为空 有可能这样做吗?还是我在尝试一些不可能的事情?我希望这是可能的,因为我正在动态链接库。顺便说一句,我在MacOSX上运行 BR从

我试过这样做,但遇到了一些不同的问题。 编译共享库gcc5.3时,我收到一条消息说:

*“malloc:对象0x7fff707d2500的错误:未分配要释放的指针。” 在malloc\u error\u break中设置断点以调试“*”

如果我尝试用gcc4.6编译共享库,我会得到非常奇怪的行为。std::stringstream类工作不正常。写入流后,结果字符串为空

有可能这样做吗?还是我在尝试一些不可能的事情?我希望这是可能的,因为我正在动态链接库。顺便说一句,我在MacOSX上运行


BR

从GCC3.0开始,g++遵循安腾ABI,因此理论上应该没有问题。但是,g++4.2有CXXABI_1.3.1,而g++4.5有CXXABI_1.3.4(请参阅)。所以我会小心的。如果没有差异,就不会增加修订号

此外,glibc++在这些版本之间进行了5次修订,这可能是您看到
std::stringstream
做有趣事情的原因之一


最后,存在许多配置选项(例如使字符串完全动态或不完全动态),它们直接影响标准库的行为和兼容性。给定两个(随机的、未知的)构建,甚至不能知道它们具有相同的配置选项。

< P>在我的经验中,ABI兼容性意味着C++库可以相互链接而没有问题。

不过,因为C++使用了很多内联函数,这并不重要。

如果标准C++库使用所有内联函数或使用所有库函数,那么您可以使用编译代码与旧版本的GCC结合新版本。


但事实并非如此。该库混合了内联和外部库代码。这意味着,如果std::string、std::vector、locales或其他内容发生了更改,则旧GCC中的内联代码与新GCC中链接的库代码不同步。

如果您不是使用相同的编译器编译,而是链接到相同的库二进制文件,C++不能保证工作。我不确定它是否与GCC版本不同。你能试着用同一个GCC编译它们吗?我曾经被告知,GCC中的C++ ABI是向后兼容的,所以在旧版本中已经存在的特征在以后版本中是相同的。有那种保证吗?MSVC非常明确地表示,它们的C++ ABI从释放到释放都发生变化。@ Krek SB理论上GCC应该遵循英特尔ItAuth+ C++ ABI(YEP,存在这种东西),因此应该是稳定的。我不知道这在实践中的效果如何,因为我主要使用MSVC。从gcc 3.0开始,g++遵循安腾ABI,因此理论上应该没有问题。但是,g++4.2有CXXABI_1.3.1,而g++4.5有CXXABI_1.3.4(请参阅)。所以我会小心的。如果没有差异,就不会增加版本号。安腾与这个问题有什么关系?关于这个平台,我们只知道“MacOSX”,它没有安腾版本,是吗?@Ben Voigt我想我现在明白你的意思了。当ItAuIn发布时,英特尔发布了一个引用C++的ABI,它是由GCC(不管我知道的平台无关)所提取的。看看这里:@Vitor:你是说gcc在其他平台上使用安腾ABI,比如amd64?我甚至不认为这是可能的,因为寄存器都是不同的。@Ben Volgt改编,作为参考。有几点是常见的,比如C++成员名字的修改等等。(达蒙联系到了一个更近的参考文献,所以我可能已经过时了。但是,在一个时期,GCC采纳了ItAiabi AbI。我不确定它是否仍然如此。)据我所知,英特尔是第一个发布开放的C++ ABI规范的人,他们为IANTIAL架构做了这件事。现在,许多编译器使用这个ABI减去ItAi铵部分,但它仍然被称为ItAialC++ C++ ABI。