我想知道是否可以将使用gcc4.2编译的c ++程序与在gcc4.5等更高版本中编译的共享c ++库链接。
我试图这样做,但遇到了一些不同的问题。 在编译共享库gcc5.3时,我收到一条消息:
*" malloc:对象0x7fff707d2500的错误:未释放指针被释放 在malloc_error_break中设置一个断点来调试" *。
如果我尝试用gcc4.6编译共享库,我会觉得很奇怪。 std :: stringstream类无法正常工作。写入流后,结果字符串为空。
有可能这样做吗?或者我在尝试一些不可能的事情?我希望这是可能的,因为我动态地链接了lib。顺便说一下,我在MacOSX上运行。
BR
答案 0 :(得分:5)
从gcc 3.0开始,g ++遵循Itanium ABI,因此理论上应该没有问题。但是,g ++ 4.2具有CXXABI_1.3.1而g ++ 4.5具有CXXABI_1.3.4(参见here)。所以我要小心。如果没有差异,就不会提升修订号。
此外,glibc ++在这些版本之间经历了5次修订,这可能是您看到std::stringstream
做有趣事情的原因之一。
最后,存在许多配置选项(例如使字符串完全动态化),它们直接影响标准库的行为和兼容性。鉴于两个(随机,未知)构建,您甚至不知道它们具有相同的配置选项。
答案 1 :(得分:4)
根据我的经验,ABI兼容性意味着C ++库可以毫无问题地相互链接。
但是,因为C ++使用了如此多的内联函数,所以这并不意味着什么。
如果标准C ++库使用了所有内联函数或使用了所有库函数,那么您可以使用使用旧版本GCC编译的代码和更新版本。
但事实并非如此。该库混合了内联和外部库代码。这意味着如果在std :: string或std :: vector或locales或其他内容中更改了某些内容,则旧GCC的内联代码与从新GCC链接的库代码不同步。