llvm-gcc和clang二进制文件是否与gcc兼容? - 尤其是Windows上的mingw gcc

时间:2010-07-10 01:55:20

标签: gcc linker llvm clang llvm-gcc

如果我使用llvm-gcc构建一个静态库,然后将它与使用mingw gcc编译的程序链接,结果是否有效?

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

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

我认为他们都使用ELF文件格式,但是调用约定,虚拟表格布局等呢?

5 个答案:

答案 0 :(得分:22)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

使用ld链接clang的.o文件时使用-m i386pep。 llvm致力于与gcc集成在http://dragonegg.llvm.org/公开展示,因此非常直观地猜测llvm系列将与gcc工具链交叉兼容。

答案 3 :(得分:1)

抱歉 - 我休息后回到了llvm,并且从未做过比教程更多的工作。第一次,在使用LLVM 2.6在MinGW GCC上构建之后,我有点沮丧 - 幸好没有LLVM 2.7的问题。

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

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

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

答案 4 :(得分:-2)

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