gcc可以鏈接到使用Visual C++創建的庫嗎?如果是這樣,那麼這樣做是否會產生任何衝突/問題?混合C/C++庫
Q
混合C/C++庫
4
A
回答
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
這是不可能的。通常甚至不可能鏈接不同版本的相同編譯器生成的庫。
0
號平原和簡單:-)
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。
相關問題
- 1. 混合數據庫關係?
- 2. C#GPGPU庫混合錯誤
- 3. 混合增強庫版本
- 4. 混合靜態庫和共享庫
- 5. 混合共享庫和靜態庫
- 6. 如何處理混合數據庫?
- 7. 混合列和行數據庫?
- 8. 在烏龜中混合存儲庫
- 9. VS2012混合C和Cpp,庫衝突
- 10. Wiki的方法 - 數據庫混合
- 11. 防止混合調試和發佈庫
- 12. C#混合不安全/安全庫
- 13. 混合靜態和動態(共享)庫?
- 14. 企業庫5混合配置
- 15. 混合SQLite數據庫和GetSharedPreferences()
- 16. GEGL庫中的加權混合
- 17. Python圖像庫添加劑混合
- 18. Rails:混合NOSQL和SQL數據庫
- 19. 混合不同版本的Java庫
- 20. Expression Blend的行爲混合09包庫
- 21. Proguard混淆混合庫清單中的活動名稱
- 22. 混合,混合模式自舉在Safari
- 23. css混合混合模式和蒙版
- 24. 在$ header中合併表單字段CC:
- 25. 混色VS Alpha混合
- 26. Android:Gridview圖像混洗/混合
- 27. 混合3 - 國?
- 28. php $ _SESSION混合
- 29. 混合算法
- 30. OpenGL的 - 混合