首页 文章

混合使用C ABI构建旧版库

提问于
浏览
5

在这种情况下,我有一个使用最近的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 回答

  • 3

    好的,你的解决方法是:

    • 将"C"接口写入旧的C库,使用3.2.3编译,这样就可以了 .

    • 现在您可以在新编译器中使用C接口 .

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

相关问题