LLVM和visual studio .obj二进制不兼容

时间:2011-06-13 11:17:01

标签: visual-c++ llvm clang

有没有人知道是否计划为Visual Studio组合的.obj和静态.lib文件提供LLVM二进制兼容性? 现在我只能将LLVM制作的.obj文件与动态库链接起来,动态库在运行时加载DLL(从visual studio编译)。

虽然两个编译器之间可能发生二进制兼容性的可能性非常小,但是有人知道为什么在一个平台的编译器之间实现这一点很困难吗?

2 个答案:

答案 0 :(得分:8)

正如Neil所说,兼容性包括调用约定,名称修改等等。虽然这两个是最小的可能问题。 LLVM已经知道所有特定于Windows的调用约定(stdcall,fastcall,thiscall),这就是你可以从.dll调用东西的原因。

如果我们谈论C ++代码,那么主要的问题是C ++ ABI:vtable布局,rtti实现等.clang跟随Itanium C ++ ABI(例如gcc使用),VCPP - 没有和所有这些遗憾的是,没有证件。在这个方向上有一些工作正在进行,所以东西可能会开始显而易见。请注意,很可能永远不会覆盖某些部分,例如在win32上基于seh的异常处理,因为它已获得专利。

与纯C代码链接工作了很长时间,因此,您可以通过C存根/包装器解决这些与C ++ ABI相关的问题。

答案 1 :(得分:1)

除了调用约定,寄存器使用等之外,对于C ++代码到二进制兼容,两个编译器必须使用相同的名称修改方案。这些方案是专有的(因此MS不会在其方案中公布细节)并且在任何情况下都处于不断变化的状态。