2008-09-04 107 views
4

gcc可以鏈接到使用Visual C++創建的庫嗎?如果是這樣,那麼這樣做是否會產生任何衝突/問題?混合C/C++庫

回答

2

一些在這裏的答案的評論是稍微有點generalistic。

雖然沒有,在具體​​情況下提到海灣合作委員會的二進制文件將不會鏈接到一個VC++庫(AFAIK)。鏈接代碼/庫的實際手段是使用ABI標準的問題。 EABI(或ARM ABI)標準(基於Itanium開發http://www.codesourcery.com/cxx-abi/期間所做的工作)是嵌入式領域日益普遍的標準。如果編譯器符合EABI標準,它們可以生成可執行文件和庫,這些文件可以相互協作。多個工具鏈協同工作的一個例子是ARM的RVCT編譯器,該編譯器生成可與GCC ARM ABI二進制文件配合使用的二進制文件。

(代碼的Sourcery鏈路出現故障的時刻,但可能是谷歌緩存)

1

我猜不是。通常,C++編譯器有很多不同的名稱修改方法,這意味着連接器將無法找到正確的符號。順便說一下,這是一件好事,因爲標準允許C++編譯器具有比這更大的不兼容性,這會導致程序崩潰,死亡,吃小狗並在牆上塗抹油漆。

解決此問題的常用方案通常涉及與COM或CORBA等獨立於語言的技術。一個更簡單的成聖方法是在你的C++代碼中使用C「包裝器」。

1

這是不可能的。通常甚至不可能鏈接不同版本的相同編譯器生成的庫。

1

是的,如果你把它一個動態鏈接,使界面C風格。 lib.exe將生成與gcc工具鏈兼容的導入庫。

這將解決您的鏈接問題。但這只是問題的開始。

你的大問題將會是異常和內存分配等問題。

  • 您必須確保沒有任何異常從VC++跨越到gcc代碼,但不兼容。
  • VC++庫中的每個對象都需要在堆上生存,因爲:
  • 不要將gcc new/delete與VC++中的任何東西混合在一起,否則會發生不好的事情。這也適用於堆棧中的對象構建。然而,如果你創建一個像create_some_obj()/ delete_some_obj()這樣的接口,你不會最終使用gcc new來構造VC++對象。也許做一個處理構造和破壞的小處理程序對象。這樣你保留RAII,但仍然使用c接口爲真正的接口。
  • 調用約定必須正確。在VC++中有cdecl和stdcall。如果gcc試圖用錯誤的調用類型調用一個導入的函數,就會發生不好的事情。

底線是一個簡單的接口,符合ANSI C標準,你應該沒問題。只要它被包含,瘋狂的C++就落後了。

哦,並確保所有的代碼是可重入的,否則你可能會打開一個整體的另一個can-o-worms。