【问题标题】:Are llvm-gcc and clang binary compatible with gcc? - particularly mingw gcc on Windowsllvm-gcc 和 clang 二进制文件与 gcc 兼容吗? - 特别是 Windows 上的 mingw gcc
【发布时间】:2011-03-14 03:35:24
【问题描述】:

如果我用 llvm-gcc 构建一个静态库,然后将它与使用 mingw gcc 编译的程序链接,结果会起作用吗?

llvm-gcc、clang 和普通 gcc 的其他组合也是如此。我对这在 Linux(当然,使用普通的非 mingw gcc)和其他平台上的效果很感兴趣,但重点是在 Windows 上。

我也对所有语言都感兴趣,但特别强调 C 和 C++ - 显然 clang 不支持 Fortran 等,但我相信 llvm-gcc 支持。

我假设它们都使用 ELF 文件格式,但是调用约定、虚拟表布局等呢?

【问题讨论】:

    标签: gcc linker llvm clang llvm-gcc


    【解决方案1】:

    是的,对于 C 代码,Clang 和 GCC 是兼容的(事实上,它们都使用 GNU 工具链进行链接。)您只需确保告诉 clang 创建编译对象而不是中间位码对象。 C ABI 定义明确,所以唯一的问题是存储格式。

    C++ 丝毫不能在编译器之间移植;不同的编译器使用不同的虚拟表调用、构造函数、销毁、名称修改、模板实现等。通常,您应该假设来自一个 C++ 编译器的对象不能与另一个编译器一起使用。

    但是,在撰写本文时,Clang++ 也能够使用 GCC/C++ 编译库;我最近设置了一个钻机,使用 G++ 的标准运行时库用 clang 编译 C++ 程序,它编译 + 链接就好了。

    【讨论】:

    • "...在撰写本文时,Clang++ 也可以使用 GCC/C++ 编译库":这一定是同时发生了变化,我不得不重新编译 Boost (V1.54)在能够链接 Clang++ 之前的 Clang++ (V3.3) - 针对它的编译代码。另见:stackoverflow.com/questions/11081818/…
    • 忘了说如果你想在 C++11 模式下使用 Clang++,你必须这样做。必须指定clang/LLVM C++11兼容的标准库,gcc的标准库不好。
    • 接受根据大众意见切换。据我回忆,我并没有真正得到我完全满意的答案,所以只是接受了任何不是我自己的非答案的东西。不过,由于这个答案对其他人来说似乎最有用,因此应该可以接受。
    • @user465139,您确定您没有尝试将链接到 libc++ 的程序与链接到 libstdc++ 的 Boost 版本链接起来吗?
    【解决方案2】:

    我不知道答案,但this presentation 中的幻灯片 10 似乎暗示 llvmgcc 生成的“.o”文件包含 LLVM 字节码 (.bc) 而不是通常的目标特定对象代码,因此链接时优化是可能的。但是,LLVM 链接器应该能够将 LLVM 代码与“普通”GCC 生成的代码链接起来,正如下一张幻灯片所说的“在此处链接本机 .o 文件和库”。

    LLVM 是一个 Linux 工具,我有时发现 Linux 编译器在 Windows 上不能正常工作。我很好奇你是否让它工作。

    【讨论】:

    • 我相信他们一直在努力尽可能多地完成工作,并且可能忽略了质量。它可以解释我是如何使用 linux 的,现在我才从 llvm 项目中得到一个工作编译器.
    • LLVM 不是“Linux 工具”。它也是苹果 OS X Unix 上首选的编译器工具链。
    【解决方案3】:

    我在通过 ld 链接 clang 的 .o 文件时使用 -m i386pep。 llvm 对与 gcc 集成的投入在http://dragonegg.llvm.org/ 公开可见,因此非常直观地猜测 llvm 系列将与 gcc 工具链极大地交叉兼容。

    【讨论】:

      【解决方案4】:

      抱歉 - 我在休息后回到 llvm,除了教程之外,我从来没有做过更多的事情。第一次,在让 LLVM 2.6 建立在 MinGW GCC 上的斗争之后,我有点筋疲力尽——幸好 LLVM 2.7 没有问题。

      今天再次浏览教程,我注意到在教程的第 5 章中,不仅明确声明 LLVM 使用平台的 ABI(应用程序二进制接口),而且教程编译器依赖于此来允许访问外部sin 和 cos 等函数。

      不过,我仍然不知道兼容的 ABI 是否扩展到 C++。这不是调用约定的问题,而是名称修改、结构布局和 vtable 布局。

      能够进行 C 函数调用对于大多数事情来说已经足够了,但我仍然关心 C++ 的一些问题。

      【讨论】:

        【解决方案5】:

        希望他们修复了它,但我避免使用 llvm-gcc,因为我(也)使用 llvm 作为交叉编译器,当您在 64 位机器上使用 llvm-gcc -m32 时,-m32 会被忽略,您会得到 64 位整数必须在您的 32 位目标机器上伪造。 Clang 没有那个错误,gcc 也没有。而且我用的越多,我就越喜欢。至于您的直接问题,不知道,理论上这些天目标已经众所周知或使用了调用约定。你会希望 gcc 和 llvm 都符合相同的要求,但你永远不知道。最简单的方法是编写几个简单的函数,使用这两个工具集编译和反汇编,看看它们如何将操作数传递给函数。

        【讨论】:

        • 抱歉,不得不对此投反对票,因为它实际上并没有回答问题,而且给出的建议(检查和比较代码输出)对我来说并不是一个好的建议。 ABI 不仅仅是如何将参数传递给函数,尤其是在涉及 C++ 而不仅仅是 C 的情况下,我只相信专家会评估两个编译器的兼容性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多