2010-07-10 37 views
27

如果我用llvm-gcc构建一个静态库,然后将它与使用mingw gcc编译的程序链接起来,结果会起作用吗?llvm-gcc和clang二进制文件是否与gcc兼容? - 尤其是在Windows上的mingw gcc

对于llvm-gcc,clang和普通gcc的其他组合也是一样的。我对Linux的工作方式感到兴趣(当然,使用普通的非mingw gcc)以及其他平台,但重点在于Windows。

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

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

回答

22

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

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

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

+0

“...在撰写本文时,Clang ++也能够使用GCC/C++编译的库”:在此期间必须进行更改,因此必须先使用Clang ++(V3.3)重新编译Boost(V1.54)能够链接Clang ++ - 编译代码。另请参阅:http://stackoverflow.com/questions/11081818/linking-troubles-with-boostprogram-options-on-osx-using-llvm/19429798#19429798 – 2013-12-21 12:51:23

+3

忘了说,如果你想要这样做,你必须这样做在C++ 11模式下使用Clang ++。你必须指定clang/LLVM C++ 11兼容的标准库,gcc的标准库不好。 – 2013-12-21 15:18:13

+1

接受根据热门意见切换。据我所知,我没有真正得到一个我完全满意的答案,所以只接受了任何不是我自己的答案。因为这个答案似乎对别人很有用,但它应该可以被接受。 – Steve314 2014-09-19 17:56:35

1

对不起 - 我休息后回到llvm,从来没有做过比教程更多的东西。第一次,在LLVM 2.6建立在MinGW GCC之上的努力之后,我有点被烧毁 - 幸好不是LLVM 2.7的问题。

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

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

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

-2

希望他们解决了这个问题,但是我避免了llvm-gcc,因为我(也)使用llvm作为交叉编译器,当你在64位机器上使用llvm-gcc -m32时,-m32被忽略,你得到64位ints必须伪装在您的32位目标机器上。 Clang没有这个bug,也没有gcc。我越用越铿锵越喜欢。至于你的直接问题,不知道,从理论上讲,这些天的目标已经广为人知,或者被用作调用约定。而且你会希望gcc和llvm遵循相同的规则,但你永远不知道。最简单的方法是编写几个简单的函数,使用两个工具集进行编译和反汇编,并查看它们如何将操作数传递给函数。

+9

对不起,不得不降低这一点,因为它实际上并没有回答这个问题,给出的建议(检查和比较代码输出)并不会成为我的好建议。 ABI不仅仅涉及参数传递给函数,特别是如果涉及C++而不仅仅涉及C,而且我只相信专家来评估两个编译器的兼容性。 – 2013-04-02 01:28:06

2

我不知道答案,但在this presentation中幻灯片10似乎意味着由llvmgcc生成的“.o”文件包含LLVM字节码(.bc)而不是通常的目标特定目标代码,因此该链接时间优化是可能的。但是,LLVM链接程序应该能够将LLVM代码与“普通”GCC生成的代码链接起来,因为下一张幻灯片中提到了“本地.o文件和库中的链接”。

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

+0

我相信他们一直在努力尽可能地完成尽可能多的工作,并且可能忽略了质量。这将解释我是如何在Linux上工作的,现在只是从LLVM项目中获得工作编译器。 – 0b1100110 2013-05-23 04:22:42

+0

LLVM不是“Linux工具”。它也是Apple的OS X上的首选编译器工具链,它是Unix。 – 2013-12-21 12:51:56

2

当我通过ld连接clang的.o文件时,我使用-m i386pep。 llvm致力于与gcc集成被公开地看作http://dragonegg.llvm.org/,所以它很直观地猜测llvm系列将大大地与gcc工具链交叉兼容。

相关问题