我可以用gcc编译一个函数然后用clang吗?

我试图使用SSE4.2内部函数与clang / llvm,但它没有编译,因为我得到cannot select intrinsic从LLVM中cannot select intrinsic错误。 另一方面,相同的代码在gcc中完美地编译。 所以我想,也许我可以使用gcc编译该函数,以便拥有一个对象或库文件,然后在我的代码中调用该库函数,该函数由clang / llvm编译。 那会有用吗?

可以在Linux中使用GCC编译目标文件,并将其转换为在Visual Studio中工作。 我最近在Windows上的Virtual Box中运行Linux 转换-c-object-file-from-linux-o-to-windows-obj所以这应该可以在Linux或Windows上使用Clang。

因此,这不仅可以通过交叉编译器完成,也可以跨平台完成

您需要使调用约定和目标文件格式正确(并且对于C ++,名称也应该是错误的)。 使用GCC编译时,可以告诉它使用哪个调用约定/ API与mabi 。 然后,如果从Linux转向Windows,则需要一个目标文件转换器,以便从Linux上的ELF转换为Windows上的COFF。 当然,有些情况下这可能不起作用(例如,如果模块依赖于仅在一个平台中的系统调用)。 有关详细信息,请参阅上面的链接。

对于任何或多或少复杂的c ++代码,例如,编译成vtable的代码 – 答案是响亮的NO。 这两个是不兼容的。

为了说明上述观点,尝试使用g ++编译Crypto ++库(为AES / GCM提高约40%的速度),然后将你的clang ++编译代码与它链接起来。

它可能或可能不起作用。 可以预期ABI的一些元素是相同的。 例如,我相信g ++和clang都使用Itanium ABI名称修改方案。 其他元素不能。 所以这取决于你编译的代码有多复杂。

另外,我建议为无法选择的内在函数打开LLVM错误 。 Clang和LLVM有一个非常活跃的社区,有可能有人会迅速挑选错误。