Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以用gcc编译一个函数,然后用clang使用它吗?_C_Gcc_Llvm_Clang - Fatal编程技术网

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

我可以用gcc编译一个函数,然后用clang使用它吗?,c,gcc,llvm,clang,C,Gcc,Llvm,Clang,我试图将SSE4.2 intrinsic与clang/llvm一起使用,但它没有编译,因为我从llvm中得到无法选择intrinsic错误。另一方面,同样的代码在gcc中编译得完美无缺。所以我想,也许我可以用gcc编译这个函数,这样就有了一个对象或库文件,然后在我的代码中调用这个库函数,它是由clang/llvm编译的。对于任何复杂或复杂的C++代码,例如编译成VTABLE的代码,这是有效的吗?答案是响亮的。不兼容。p> 为了说明上述观点,请尝试使用g++编译库(AES/GCM的加速比约为40%

我试图将SSE4.2 intrinsic与clang/llvm一起使用,但它没有编译,因为我从llvm中得到
无法选择intrinsic
错误。另一方面,同样的代码在gcc中编译得完美无缺。所以我想,也许我可以用gcc编译这个函数,这样就有了一个对象或库文件,然后在我的代码中调用这个库函数,它是由clang/llvm编译的。对于任何复杂或复杂的C++代码,例如编译成VTABLE的代码,这是有效的吗?答案是响亮的。不兼容。p>
为了说明上述观点,请尝试使用g++编译库(AES/GCM的加速比约为40%),然后将您的clang++编译代码与之链接。

它可能工作,也可能不工作。ABI的某些元素可以预期是相同的。例如,我相信g++和clang都使用安腾ABI名称损坏方案。其他元素不能。因此,这取决于编译的代码有多复杂


此外,我还建议为无法选择的内在特性打开一个新窗口。Clang和LLVM有一个非常活跃的社区,可能有人会很快发现这个bug。

可以在Linux中使用GCC编译一个对象文件,并将其转换为在Visual Studio中工作。我最近在Windows上的虚拟盒中运行Linux,所以在Linux或Windows上也可以使用Clang

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


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

可能。这将取决于您的系统。雨衣?Linux?窗户?通常,您可以混合使用clang和gcc构建的对象文件。不过,请确保使用相同的标准库(不要混合使用
libc++
libstdc++
);那里的所有编译器都使用公共ABI(应用程序二进制接口,即执行传输/调用函数、传递和返回参数、布局数据结构/对齐变量的相同机制)。对于C++,这不是一般的(例如,你不能从GCC/MIWW调用微软Visual C++代码,反之亦然),但是在GCC/CLAN案例中,你很幸运,他们使用相同的C和C++ ABI,因此二进制代码是兼容的:@ Fr.H.,你可以从MSVC调用GCC代码(见我的答案)。事实上,您可以从GCC调用MSVC(虽然我不知道为什么您会这样做,因为GCC总是更擅长优化),但这更困难,因为MSVC不提供一种生成Unix函数调用约定的方法,所以您必须在创建对象后执行,而且限制性更强(例如,仅适用于具有四个参数的函数)@Zboson我很清楚ABIs:)以及各自的(in)兼容性。我同意你的观点,如果你非常小心,你可以在GC/MSVC使用的C++调用约定之间创建代码层。这不是自动的/根本不能保证。@Zboson stackoverflow的搜索救援,重“thunking”:)这个问题被标记为C,所以整个ABI可以预期是相同的。你是对的,我误解了这个问题。不过,关于这个错误的部分仍然存在。纠正我自己的答案:是的,你可以。使用“clang++-stdlib=libstdc++”编译代码。然后它将正确链接到g++编译库(包括Crypto++)。不幸的是,相反的方法不起作用:无论我尝试了什么标志,g++编译的代码都不能与clang++编译的库一起工作-(