llvm-gcc和clang是否与gcc二进制兼容?特别是在Windows上的mingw gcc。

28
如果我使用llvm-gcc构建一个静态库,然后使用mingw gcc编译的程序链接它,结果会工作吗?
其他组合的情况都是一样的,包括llvm-gcc、clang和普通gcc。我对Linux(当然是使用普通的非mingw gcc)和其他平台上的操作也感兴趣,但重点是在Windows上。
我对所有编程语言都感兴趣,但对C和C++有很强的重视-显然clang不支持Fortran等语言,但我相信llvm-gcc是支持的。
我假设它们都使用ELF文件格式,但调用约定、虚表布局等方面呢?
5个回答

24

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

C++ 在不同编译器之间并不可移植;不同编译器使用不同的虚拟表调用、构造函数、析构函数、名称重整、模板实现等。通常情况下,您应该假设来自一个 C++ 编译器的对象将无法在另一个编译器中运行。

然而,在撰写本文时,Clang++ 能够使用 GCC/C++ 编译的库;我最近设置了一台机器,使用 G++ 的标准运行时库来编译 C++ 程序,并且可以正常编译和链接。


“...在撰写本文时,Clang++ 能够使用 GCC/C++ 编译的库。但这种情况可能已经发生了变化,我不得不使用 Clang++(V3.3)重新编译 Boost(V1.54),才能将 Clang++ 编译的代码与其链接起来。详情请参见:https://dev59.com/AGXWa4cB1Zd3GeqPJhk6#19429798。” - András Aszódi
3
如果您想在C++11模式下使用Clang ++,您需要执行以下操作。您必须指定clang / LLVM C++11兼容的标准库,gcc的标准库不够好。 - András Aszódi
1
根据大众意见接受转换。就我所记得的,我并没有得到一个完全满意的答案,所以只是接受了任何不是我的非答案的东西。虽然这个答案似乎对其他人最有用,但它应该被接受。 - user180247
@user465139,你确定你没有试图将使用libc++链接的程序与使用libstdc++链接的Boost版本进行链接吗? - Sydius

2

在使用ld链接clang的.o文件时,我会使用-m i386pep选项。LLVM致力于与GCC集成,这在http://dragonegg.llvm.org/上可以明显看到,因此很容易猜测LLVM家族将与GCC工具链高度兼容。


2
我不知道答案,但是这个演示文稿中的第10页似乎暗示着由llvmgcc生成的“.o”文件包含LLVM字节码(.bc)而不是通常的目标特定对象代码,因此可以进行链接时优化。然而,LLVM链接器应该能够将LLVM代码与“普通”的GCC生成的代码链接起来,正如下一张幻灯片所说:“在这里链接本地.o文件和库”。

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


我相信他们一直在努力尽可能多地完成任务,但可能忽略了质量。这可以解释为什么我正在使用Linux,现在才从LLVM项目中获得一个可用的编译器。 - 0b1100110
LLVM不仅仅是“Linux工具”,它也是苹果OS X上首选的编译器工具链,而OS X则属于Unix系统。 - András Aszódi

1

抱歉 - 我在休息后回到llvm,除了教程之外并没有做过太多事情。第一次尝试时,在MinGW GCC上构建LLVM 2.6时遇到了困难,导致我有些疲惫 - 幸运的是,这不是LLVM 2.7的问题。

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

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

能够进行C函数调用对于大多数事情来说已经足够了,但仍有一些问题需要关注C ++。


-2
希望他们已经修复了,但我避免使用llvm-gcc,因为我也使用llvm作为交叉编译器,当你在64位机器上使用llvm-gcc -m32时,-m32会被忽略,你会得到64位整数,这需要在32位目标机器上进行伪装。Clang没有这个bug,gcc也没有。而且我越用clang越喜欢。至于你的直接问题,不知道,在理论上,现在的目标都有公认或常用的调用约定。希望gcc和llvm都遵循相同的约定,但你永远不知道。找出答案最简单的方法是编写几个简单的函数,使用两种工具集进行编译和反汇编,看它们如何传递操作数给函数。

11
抱歉,我必须给这个回答投反对票,因为它并没有真正回答问题,而且给出的建议(检查和比较代码输出)并不是好建议。ABI 不仅涉及参数如何传递给函数,特别是涉及 C++ 而不仅仅是 C 的情况下,还有更多内容需要考虑。我只会相信专家来评估两个编译器的兼容性。 - Kef Schecter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接