27

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

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

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

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

4

5 回答 5

23

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

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

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

于 2012-06-30T14:04:42.483 回答
2

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

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

于 2010-07-16T21:44:43.307 回答
2

I use -m i386pep when linking clang's .o files by ld. llvm's devotion to integrating with gcc is seen openly at http://dragonegg.llvm.org/ so its very intuitive to guess llvm family will greatly be cross-compatible with gcc tool-chain.

于 2013-03-04T12:31:32.610 回答
1

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

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

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

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

于 2010-07-10T21:47:21.253 回答
-2

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

于 2010-07-11T04:22:00.977 回答