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

Pau*_* D. 5 c++ legacy gcc 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版本来满足库之间不同的依赖关系.但是,这似乎并没有很好地工作,除非我遗漏了一些东西.

有任何想法吗?

Cas*_*Cow 4

好的,您的解决方法是:

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

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