【问题标题】:Mixing libraries from different C++ compilers混合来自不同 C++ 编译器的库
【发布时间】:2009-05-19 18:13:56
【问题描述】:

我正在开发一个跨越多个不同组织的项目的 redhat 5.2。每个组织都提供已使用各种版本的 g++ 编译的库。目前,这些版本包括 4.1.1、4.1.2 和 4.3.1。我正在尝试使用 4.1.2 将所有库链接到一个可执行文件中。这样做可能会出现什么问题(如果有的话)?顺便说一句,有没有办法判断每个编译器版本构建到哪个 ABI?

【问题讨论】:

  • 一开始我以为你指的是 Red Hat 5.2 (Apollo),已经有十多年的历史了。 :)

标签: c++ linux compiler-construction compatibility


【解决方案1】:

ABI 政策文档详细说明了不同 ABI 版本之间的兼容性。 据此,libstdc++.so 库应该是兼容的,而 gcc 上一次破坏二进制兼容性是在 3.4。你应该没事。

【讨论】:

    【解决方案2】:

    GCC(GNU Compiler Collection)定义版本号和兼容性。

    4.1.1 和 4.1.2 之间的 G++ 库应该是兼容的;与最新的链接。

    4.1.x 和 4.2.x 之间的 G++ 库不兼容;你需要重新编译一些东西。

    3.x.y 和 4.p.q 之间的 G++ 库不兼容;你需要重新编译一些东西。

    在您的场景中,使用 4.3.1 构建的代码与其余代码不兼容。

    您要么必须重新编译当前使用 4.3.x 编译的代码以便使用 4.1.x,要么需要重新编译当前使用 4.1.x 编译的代码以便使用 4.3.x。

    【讨论】:

    • 理论上是这样,但在实践中,最后一次 ABI 更改是 3.4
    • @Edu:但是在未来的任何时候,都可能会发生调用该规则的更改,并且对事情草率的人可能会感到惊讶(不得不重新编译)。
    【解决方案3】:

    也许静态链接可执行文件更容易...生成一个大二进制文件,但可以在所有平台上运行。

    【讨论】:

      【解决方案4】:

      链接从不同版本的 g++ 构建的库应该没有问题,除非它们已在 g++ 网站上列出。但重要的是这些库构建在同一平台上,在您的情况下是 redhat 5.2。为 linux/redhat(比如 solaris)以外的平台构建的库不会与您的 exe 链接。

      【讨论】:

        【解决方案5】:

        IIRC,有一个 C++ 兼容性库可以做到这一点。我认为它叫做 libstdc++-compat

        【讨论】:

        • 您不能将依赖于不同版本的 stdlibc++ 的对象链接在一起。
        猜你喜欢
        • 1970-01-01
        • 2022-12-14
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        相关资源
        最近更新 更多