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