2010-07-10 35 views
27

如果我用llvm-gcc構建一個靜態庫,然後將它與使用mingw gcc編譯的程序鏈接起來,結果會起作用嗎?llvm-gcc和clang二進制文件是否與gcc兼容? - 尤其是在Windows上的mingw gcc

對於llvm-gcc,clang和普通gcc的其他組合也是一樣的。我對Linux的工作方式感到興趣(當然,使用普通的非mingw gcc)以及其他平臺,但重點在於Windows。

我對所有語言也很感興趣,但是強調C和C++ - 顯然clang不支持Fortran等,但我相信llvm-gcc。

我假設他們都使用ELF文件格式,但是如何調用約定,虛擬表格佈局等?

回答

22

是的,對於C代碼Clang和GCC兼容(實際上它們都使用GNU工具鏈進行鏈接)。您只需確保告訴clang創建編譯對象而不是中間位代碼對象。 C ABI是明確的,所以唯一的問題是存儲格式。

C++在編譯器之間不能輕鬆移植;不同的編譯器使用不同的虛擬表調用,構造函數,銷燬,名稱修改,模板實現等。通常,您應該假設來自一個C++編譯器的對象不能與另一個編譯器一起工作。

但是,在撰寫本文時,Clang ++也能夠使用GCC/C++編譯庫;最近,我使用G ++的標準運行時庫建立了一個使用clang編譯C++程序的工具,它編譯+鏈接就好了。

+0

「...在撰寫本文時,Clang ++也能夠使用GCC/C++編譯的庫」:在此期間必須進行更改,因此必須先使用Clang ++(V3.3)重新編譯Boost(V1.54)能夠鏈接Clang ++ - 編譯代碼。另請參閱:http://stackoverflow.com/questions/11081818/linking-troubles-with-boostprogram-options-on-osx-using-llvm/19429798#19429798 – 2013-12-21 12:51:23

+3

忘了說,如果你想要這樣做,你必須這樣做在C++ 11模式下使用Clang ++。你必須指定clang/LLVM C++ 11兼容的標準庫,gcc的標準庫不好。 – 2013-12-21 15:18:13

+1

接受根據熱門意見切換。據我所知,我沒有真正得到一個我完全滿意的答案,所以只接受了任何不是我自己的答案。因爲這個答案似乎對別人很有用,但它應該可以被接受。 – Steve314 2014-09-19 17:56:35

1

對不起 - 我休息後回到llvm,從來沒有做過比教程更多的東西。第一次,在LLVM 2.6建立在MinGW GCC之上的努力之後,我有點被燒燬 - 幸好不是LLVM 2.7的問題。

今天再次閱讀教程,我在本教程的第5章中注意到,不僅LLVM使用平臺的ABI(應用程序二進制接口)的明確聲明,而且教程編譯器依賴於此來允許訪問外部函數,如sin和cos。

雖然我仍然不知道兼容的ABI是否擴展到C++。這不像調用名稱,結構佈局和vtable佈局這樣的調用約定的問題。

能夠進行C函數調用對於大多數事情來說已經足夠了,但仍然存在一些我關心C++的問題。

-2

希望他們解決了這個問題,但是我避免了llvm-gcc,因爲我(也)使用llvm作爲交叉編譯器,當你在64位機器上使用llvm-gcc -m32時,-m32被忽略,你得到64位ints必須僞裝在您的32位目標機器上。 Clang沒有這個bug,也沒有gcc。我越用越鏗鏘越喜歡。至於你的直接問題,不知道,從理論上講,這些天的目標已經廣爲人知,或者被用作調用約定。而且你會希望gcc和llvm遵循相同的規則,但你永遠不知道。最簡單的方法是編寫幾個簡單的函數,使用兩個工具集進行編譯和反彙編,並查看它們如何將操作數傳遞給函數。

+9

對不起,不得不降低這一點,因爲它實際上並沒有回答這個問題,給出的建議(檢查和比較代碼輸出)並不會成爲我的好建議。 ABI不僅僅涉及參數傳遞給函數,特別是如果涉及C++而不僅僅涉及C,而且我只相信專家來評估兩個編譯器的兼容性。 – 2013-04-02 01:28:06

2

我不知道答案,但在this presentation中幻燈片10似乎意味着由llvmgcc生成的「.o」文件包含LLVM字節碼(.bc)而不是通常的目標特定目標代碼,因此該鏈接時間優化是可能的。但是,LLVM鏈接程序應該能夠將LLVM代碼與「普通」GCC生成的代碼鏈接起來,因爲下一張幻燈片中提到了「本地.o文件和庫中的鏈接」。

LLVM是一個Linux工具,我有時會發現Linux編譯器在Windows上不能正常工作。我會好奇你是否能夠正常工作。

+0

我相信他們一直在努力盡可能地完成儘可能多的工作,並且可能忽略了質量。這將解釋我是如何在Linux上工作的,現在只是從LLVM項目中獲得工作編譯器。 – 0b1100110 2013-05-23 04:22:42

+0

LLVM不是「Linux工具」。它也是Apple的OS X上的首選編譯器工具鏈,它是Unix。 – 2013-12-21 12:51:56

2

當我通過ld連接clang的.o文件時,我使用-m i386pep。 llvm致力於與gcc集成被公開地看作http://dragonegg.llvm.org/,所以它很直觀地猜測llvm系列將大大地與gcc工具鏈交叉兼容。

相關問題