Clang、GCC和LTO之间的互操作性

5
我知道Clang和GCC作为C/C++编译器在某种程度上是兼容的,只要注意架构标志、预定义和链接正确的库。使用一个编译器创建库并将其与另一个编译器创建的对象链接实际上非常容易(至少在x86上)。
这里有一个小型测试项目,正是如此: https://gitlab.com/higaski/Interoperability 但我想知道链接时优化(LTO)是否可以跨编译器工作?我知道LTO需要一些形式的中间表示,例如LLVM的位码或GCC的GIMPLE,但也许有一种工作流程可以同时利用它们?

3
使用一种编译器创建库,再将其与另一种编译器创建的对象进行链接实际上并不是一个好主意,即使这些编译器是同一款特定编译器的不同版本。 - user7860670
如果您使用gcc所称的FAT LTO对象,则会生成同时包含内部表示(gcc可以使用)和常规已编译代码(其他编译器可以使用)的对象。 - Marc Glisse
3
确实,GCC的-ffat-lto-objects选项可以产生对象文件,即使启用LTO也可以与Clang对象进行链接。下面是适合我的组合: GCC使用-flto -ffat-lto-objects -> Clang使用-flto -fuse-ld=gold (在链接时使用ld或lld会给我带来错误)那么,Clang是否有生成“FAT”对象的方法呢?目前这个选项只能在使用Clang和LTO编译时使用GCC对象,但不能反过来使用。 - Vinci
1个回答

2
不行,LTO无法在编译器之间共享,因为它实际上是编译器内部表示的转储。即使是同一编译器的不同版本也无法保证这种表示稳定。

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