2011-06-13 76 views
5

有誰知道LLVM二進制兼容性是否計劃用於Visual Studio梳理.obj和靜態.lib文件? 現在,我只能將LLVM製作的.obj文件與運行時加載DLL(從visual studio編譯)的動態庫鏈接起來。LLVM和Visual Studio .obj二進制不兼容

雖然在兩個編譯器之間可能會發生二進制兼容性的可能性非常小,但是有人知道爲什麼在一個平臺的編譯器之間實現這一點很困難嗎?

+0

在我的練習中,clang .o和其他庫最多可以鏈接的程度與ld獲得的成功程度相當。具體到我的設置我使用-m i386pep與ld。如果未來llvm的市場超過ABI兼容性,恕我直言最好的猜測是這是侷限性。 – 2013-03-04 13:03:18

回答

8

正如尼爾所說,兼容性包括調用約定,名稱修改等等。儘管這兩個是最小的可能問題。 LLVM已經知道所有特定於Windows的調用約定(stdcall,fastcall,thiscall),這就是爲什麼你可以從.dll調用東西。

如果我們談論C++代碼,那麼主要問題是C++ ABI:vtable佈局,rtti實現等。clang遵循Itanium C++ ABI(其中包括gcc使用,例如VCPP) - 並不是這些都是無證的,不幸的。在這個方向上有一些工作正在進行,所以東西顯然可能開始工作。請注意,很可能某些部分絕不會被覆蓋,例如基於seh的win32異常處理,因爲它已獲得專利。因此,您可以通過C存根/包裝來解決這些與C++ ABI相關的問題。

1

除了其他的東西,比如調用約定,寄存器使用等等,對於C++代碼來說二進制兼容,兩個編譯器必須使用相同的名稱修改方案。這些方案是專有的(因此如果MS的方案沒有公佈細節),並且在任何情況下都處於不斷變化的狀態。

+1

我發現了微軟名稱修剪方案(甚至在維基百科上)的文檔,所以我不認爲這是主要原因。我還沒有調查是否有可能通過命令行切換來改變mangling方案。我會檢查我什麼時候回家。 – Andos 2011-06-13 14:30:23

+0

@Andos它不是,這是主要原因之一。維基百科不是文檔。 – 2011-06-13 15:12:05

+0

這裏的名稱修改是可能的最小問題。主要問題是C++ ABI兼容性。 – 2011-06-14 05:53:48