llvm gcc和clang二进制文件是否与gcc兼容特别是Windows上的mingw gcc

llvm gcc和clang二进制文件是否与gcc兼容特别是Windows上的mingw gcc,gcc,linker,llvm,clang,llvm-gcc,Gcc,Linker,Llvm,Clang,Llvm Gcc,如果我用llvm gcc构建一个静态库,然后将它与使用mingw gcc编译的程序链接,结果会起作用吗 llvm gcc、clang和普通gcc的其他组合也是如此。我对Linux(当然是使用普通的非MingWGCC)和其他平台上如何实现这一点很感兴趣,但重点是Windows 我对所有的语言都感兴趣,但是强调C和C++——显然CLAN不支持Fortran等,但我相信LLVM GCC确实如此。 我假设它们都使用ELF文件格式,但是调用约定、虚拟表布局等呢?对不起,休息一下我回到llvm,除了教程之外

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

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

我对所有的语言都感兴趣,但是强调C和C++——显然CLAN不支持Fortran等,但我相信LLVM GCC确实如此。
我假设它们都使用ELF文件格式,但是调用约定、虚拟表布局等呢?

对不起,休息一下我回到llvm,除了教程之外,我从来没有做过更多的工作。第一次,我在争取LLVM2.6建立在MingWGCC之上的过程中有点筋疲力尽——谢天谢地,LLVM2.7没有问题

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

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


能够使C函数调用对大多数事物来说已经足够了,但仍然有一些问题我关心C++。< / P > < P>希望它们修复它,但是我避免LLVM GCC,因为我(也)将llvm用作交叉编译器,当您在64位机器上使用llvm gcc-m32时,-m32将被忽略,您将获得64位整数,这些整数必须在32位目标机器上伪造。Clang没有这个bug,gcc也没有。而且我越是使用叮当声,我就越喜欢它。至于你的直接问题,不知道,在理论上,这些天的目标已经众所周知或使用呼叫约定。您希望gcc和llvm都符合相同的要求,但您永远不知道。找到这一点的最简单方法是编写两个简单函数,使用这两个工具集编译和反汇编,并查看它们如何将操作数传递给函数。

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


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

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

C++在编译器之间根本不可移植;不同的编译器使用不同的虚拟表调用、构造函数、销毁、名称修改、模板实现等。作为规则,你应该假定来自一个C++编译器的对象将不能与另一个编译器工作。
然而,是的,在编写Clang++时,它也能够使用GCC/C++编译库;我最近建立了一个平台,用C++的标准运行时库编译CLAN程序,它编译+链接很好。llvm致力于与gcc集成,这一点在会议上是公开的,因此它非常直观地猜测llvm系列将与gcc工具链非常兼容。

很抱歉,我不得不对此投反对票,因为它实际上没有回答问题,并且给出的建议(检查和比较代码输出)对我来说并不是一个好的建议。对于ABI来说,参数如何传递给函数,尤其是C++和C,而我只相信一个专家来评估两个编译器的兼容性。我相信他们一直在努力尽可能多地完成任务,也许忽略了质量。这将解释我是如何在linux上工作的,我现在才从llvm项目中获得一个可以工作的编译器。llvm不是“linux工具”。它也是苹果操作系统X(即Unix)上首选的编译器工具链。“…在编写Clang++时,它也能够使用GCC/C++编译库”:这一定已经改变了,在此期间,我必须用Clang++(V3.3)重新编译Boost(V1.54),然后才能将Clang++-编译代码与之关联。另请参见:如果您想在C++11模式下使用Clang++,请忘了说您必须这样做。您必须指定与clang/LLVM C++11兼容的标准库,gcc的标准库不好。接受基于流行观点的切换。据我回忆,我并没有得到一个我完全满意的答案,所以我接受了任何不是我自己的答案的东西。但是,由于这个答案对其他人来说似乎最有用,所以可能应该接受。@user465139,您确定您没有试图将一个链接到libc++的程序与一个链接到libstdc++的Boost版本相链接吗?