gpt4 book ai didi

c++ - 混合 C++ ABI 以针对遗留库进行构建

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:10 26 4
gpt4 key购买 nike

情况是这样的,我有一个使用最新 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++ 标准库符号的 undefined symbol 错误。
  • 与上述相同,但额外链接到 libstdc++ 5 的共享库中,这解决了链接器问题,但似乎会导致旧库中两个版本在运行时混合,从而导致崩溃。

我读了这个页面:http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html这似乎表明可以在应用程序中混合使用 C++ ABI 版本以满足库之间的不同依赖性。不过,除非我遗漏了什么,否则它在这里似乎不太管用。

有什么想法吗?

最佳答案

好的,您的解决方法是:

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

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

关于c++ - 混合 C++ ABI 以针对遗留库进行构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com