【发布时间】:2018-07-10 07:21:16
【问题描述】:
我知道 Clang 和 GCC 或多或少是兼容的 C/C++ 编译器,只要它们负责架构标志、预定义和链接正确的库之类的事情。使用一个编译器创建库并将它们与另一个编译器创建的对象链接起来实际上非常容易(至少在 x86 上)。
这是一个小测试项目,正是这样做的: https://gitlab.com/higaski/Interoperability
但是我想知道链接时间优化 (LTO) 是否可以跨编译器工作?我知道 LTO 需要某种形式的中间表示,例如 LLVM 位码或 GCC GIMPLE,但也许有一个工作流程可以同时使用它们?
【问题讨论】:
-
用一个编译器创建库并将它们与另一个编译器创建的对象链接起来实际上不是一个好主意。即使这些编译器是特定编译器的不同版本。
-
如果您使用 gcc 调用的 FAT LTO 对象,那么您生成的对象既包含内部表示(gcc 可以使用)又包含常规编译代码(其他编译器可以使用)。跨度>
-
@MarcGlisse GCCs -ffat-lto-objects 确实会生成可以链接到 Clang 对象的对象文件,即使启用了 LTO 也是如此。以下组合对我有用: GCC with -flto -ffat-lto-objects -> Clang with -flto -fuse-ld=gold (ld 或 lld 在链接时给了我错误) Clang 有没有办法产生“FAT”对象也是?目前这个选项只能在使用 Clang 和 LTO 编译时使用 GCC 对象,反之则不行?