在这种情况下,我有一个使用最近的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 回答
好的,你的解决方法是:
将"C"接口写入旧的C库,使用3.2.3编译,这样就可以了 .
现在您可以在新编译器中使用C接口 .
您可以在C库周围编写一些C“包装器”代码,以便将其用作C,但此代码将在新编译器中构建 .