混合使用C ++ ABI来构建旧库

时间:2012-02-06 15:26:47

标签: c++ gcc legacy abi

在这种情况下,我有一个使用最近的GCC(4.3.3)的C ++代码库,但我需要链接一个使用GCC 3.2.3构建的旧库。没有更新版本的库,我不能没有它,它是封闭的源代码,因此无法重建。

这似乎是一个问题,因为GCC 4.3.3和3.2.3之间存在ABI不兼容性,所以我试图看看我的解决方案是什么选择。

一些额外的细节:

  • 我可以使用-fabi-version = 1重新构建代码库中的所有内容以获取正确的ABI版本,但我依赖于libstdc ++版本6的一些较新功能。
  • 代码库之外的所有C ++库依赖项都是开源的,所以我可以根据需要重建它们,除了这个库。
  • 许多无法重建或难以重建的C库依赖项。
  • 旧库似乎依赖于某些libstdc ++第5版功能

我到目前为止尝试过:

  • 使用-fabi-version = 1重建所有C ++代码和依赖库,并链接libstdc ++版本6.这会导致C ++标准库符号出现一些未定义的符号错误。
  • 与上面相同,但另外在libstdc ++ 5的共享库中链接,这解决了链接器问题,但似乎导致在运行时在遗留库内混合两个版本,并导致崩溃。

我读了这个页面:http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html这似乎表明可以在应用程序中混合使用C ++ ABI版本来满足库之间不同的依赖关系。但是,除非我遗漏了一些东西,否则它似乎在这里工作得不好。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

好的,您的解决方法是:

  • 在旧的C ++库中编写一个“C”接口,用3.2.3编译,这样就可以了。
  • 现在您可以在新编译器中使用C接口。

您可以在C库周围编写一些C ++“包装器”代码,这样您就可以将它用作C ++,但这段代码将在新编译器中构建。