我正在尝试将 SSE4.2 内在函数与 clang/llvm 一起使用,但它没有编译,因为我cannot select intrinsic
从 LLVM 收到错误。另一方面,相同的代码在 gcc 中可以完美编译。所以我想,也许我可以用gcc编译那个函数,以便有一个对象或库文件,然后在我的代码中调用那个库函数,它是由clang/llvm编译的。那行得通吗?
3 回答
可以在 Linux 中使用 GCC 编译目标文件并将其转换为在 Visual Studio 中工作。我最近在 Windows 上的 Virtual Box 中运行 Linux转换-c-object-file-from-linux-o-to-windows-obj 所以这应该可以在 Linux 或 Windows 上使用 Clang。
所以这不仅可以跨编译器完成,还可以跨平台完成。
您需要获得正确的调用约定和目标文件格式(对于 C++,名称也需要修改)。使用 GCC 编译时,您可以告诉它与mabi
. 然后,如果从 Linux 转到 Windows,您需要一个目标文件转换器来将例如 Linux 上的 ELF 转换为 Windows 上的 COFF。当然,在某些情况下这可能不起作用(例如,如果模块依赖于仅在一个平台中的系统调用)。有关更多详细信息,请参阅上面的链接。
它可能起作用,也可能不起作用。可以预期 ABI 的某些元素是相同的。例如,我相信 g++ 和 clang 都使用 Itanium ABI 名称修改方案。其他元素不能。所以这取决于你正在编译的代码有多复杂。
另外,我建议为无法选择的内在函数打开一个LLVM 错误。Clang 和 LLVM 有一个非常活跃的社区,可能有人会很快发现这个错误。
对于任何或多或少复杂的 c++ 代码,例如编译为 vtable 的代码 - 答案是响亮的“否”。两者不兼容。
为了说明上述观点,尝试使用 g++ 编译Crypto++库(对于 AES/GCM 获得大约 40% 的加速),然后将您的 clang++ 编译代码与其链接。