【问题标题】:Is a GCC 4.7 compiled lib compatible with a GCC 4.6.3 program?GCC 4.7 编译的库是否与 GCC 4.6.3 程序兼容?
【发布时间】:2025-11-21 00:30:07
【问题描述】:

我有一个巨大的 C++11 项目,其中包含诸如功能之类的插件。我的项目有一些库(用 gcc 4.6.3 编译)、一个前端(用 gcc 4.6.3 编译)和一些插件(用 gcc 4.7 编译)。插件通过dlopen 加载并从库中引用内容。

我的项目使用模板、typeinfo、shared_ptr、stl 容器等。

当我使用相同版本的 gcc 编译所有内容时,一切运行正常。当我按照我描述的方式编译(4.6.3 中的库和前端以及 4.7 中的插件)时,我开始遇到问题。

我不确定发生了什么,希望您能给我一些线索并帮助我解决这个问题。

【问题讨论】:

  • "当我使用相同版本的 gcc 编译所有内容时,一切正常。当我按照我描述的方式编译时(4.6.3 中的库和前端以及 4.7 中的插件)我开始面临问题.”听起来你已经回答了自己的问题......

标签: c++ linux gcc c++11


【解决方案1】:

G++ 4.6 与 4.7 兼容,尽管人们在这里声称,只要在运行时使用来自用于构建任何对象的最新版本的 libstdc++.so。

但是对于 C++11,由于支持仍在不断发展,因此保证较少(直到最近 C++11 也是如此!)所以我们无法避免做出一些不兼容的更改以改进 C++ 11 支持。

如需更完整的答案,请在 gcc-help 邮件列表中发布您的问题的详细信息,我会调查一下

【讨论】:

  • 我试图找出问题,但我还没有做到。
  • 明确一点:如果您将库和可执行文件静态链接到不同版本的 libstdc++,它将无法正常工作?
  • 可能,这取决于它们之间传递的类型,以及这些类型是否在版本之间发生变化。对于 C++03 或应该可以正常工作的任何东西,对于 C++11,它取决于。 OP 是静态链接的吗?
【解决方案2】:

来自http://gcc.gnu.org/gcc-4.7/changes.html

GCC 版本 4.7.0 和 4.7.1 对 C++ 标准库进行了更改,这影响了 C++11 模式下的 ABI:向 std::list 添加了一个数据成员,更改了它的大小并更改了某些成员的定义函数,并且 std::pair 的移动构造函数非常重要,它改变了具有 std::pair 参数或返回类型的函数的调用约定。 GCC 版本 4.7.2 的 ABI 不兼容性已得到修复,但因此使用 GCC 4.7.0 或 4.7.1 编译的 C++11 代码可能与使用不同 GCC 版本和 C++ 编译的 C++11 代码不兼容98/C++03代码,任意版本编译。

我遇到了 std::list 问题

【讨论】:

    最近更新 更多