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

时间:2013-05-03 15:49:36

标签: c gcc llvm clang

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

3 个答案:

答案 0 :(得分:4)

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

因此,不仅可以跨编译器完成,也可以跨平台完成

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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