情况是这样的,我有一个使用最新 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 http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html这似乎表明可以在应用程序中混合 C++ ABI 版本以满足库之间不同的依赖关系。不过,除非我遗漏了一些东西,否则它在这里似乎不太有效。
有任何想法吗?
好的,您的解决方法是:
- 为旧的 C++ 库编写一个“C”接口,使用 3.2.3 进行编译,这样它就可以工作了。
- 现在您可以在新编译器中使用 C 接口。
您可以围绕 C 库编写一些 C++“包装器”代码,以便将其用作 C++,但该代码将在新编译器中构建。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)