6

情况就是这样,我有一个使用最新 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 版本以满足库之间不同的依赖关系。不过,它在这里似乎不太好用,除非我遗漏了一些东西。

有任何想法吗?

4

1 回答 1

4

好的,您的解决方法是:

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

您可以围绕 C 库编写一些 C++“包装器”代码,以便将其用作 C++,但此代码将在新编译器中构建。

于 2012-02-06T15:32:11.007 回答