我使用我的G ++交叉編譯器交叉編譯了一個開源庫(基於C++)。我現在試圖在我的GCC編譯器構建的基於C的應用程序中使用輸出的.a文件......這可能嗎?你可以從C應用程序鏈接一個C++庫嗎?
回答
是的。確保您要使用的所有函數都是extern「C」,並且您只對要使用的函數使用基本類型。
如果您使用與G ++相同的GCC版本,那肯定不會有任何問題。跨版本應該沒問題,但可能會有很小的不兼容性。新的GCC(3.0+)符合安騰ABI,因此它們會很好;他們就如何交換&格式數據達成了二元協議。
您可以將C應用程序鏈接到一個C++庫, 但你只能包括含有效C頭文件 - 而不是C++ - 代碼, 使用任何C++調用必須聲明與外部的「C函數「 宣言。
最簡單,最簡單的方法要做到這一點,假設您的C代碼是相當理智的,就是簡單地使用g ++構建您的C應用程序。請記住,好的C代碼幾乎總是以C++編譯器爲基礎構建的。那麼就沒有特別的考慮,不需要添加外部「C」語句,也不需要ABI問題等,並且無論函數如何聲明,都可以輕鬆使用C++庫。
您需要確保從C代碼調用的C++函數聲明爲extern "C"
,並且它們的接口只使用可以由C處理的類型(簡單類型,不透明指針等)。
您可能還需要將應用程序與C++編譯器(而不是C編譯器)鏈接,以確保爲C++庫執行了正確的初始化。用於鏈接的C++編譯器必須與用於生成庫的C++編譯器'相同'。這意味着要麼是相同版本的C++編譯器,要麼是它的兼容版本。這通常意味着如果庫是由CompilerB(來自供應商B)生成的,則無法與CompilerA(來自供應商A)鏈接; C++運行時約定是這樣的,不同的編譯器(故意地)使用不同的方案來支持C++的不同特性。
如果C++庫具有C++接口,您不能直接使用它們,則必須創建編譯爲C++但具有外部「C」鏈接的包裝。這種包裝的複雜性將取決於界面的特性,使用C++ - 只有諸如類的特性以及函數/運算符重載將需要將OO接口映射到過程接口。
您的問題的答案是「是」,但正如其他人指出的那樣,有一些注意事項,對您可以執行的操作的限制& &您是如何做到的。
就在最近與客戶討論這個話題的過程中,我遇到了一篇文章,對這個話題的處理非常好。文章論述了像調用C代碼C++代碼,從C代碼,連接器方面的考慮,功能包裝,異常聯動規範調用C++代碼,以及在C訪問C++類等
- 1. 你可以從MS SQL Server調用C++應用程序嗎?
- 2. (C++)你可以添加一個直接鏈接到一個C + +程序出GUI嗎?
- 3. 可以從C++/CX應用程序調用OpenCV庫嗎?
- 4. 鏈接C#類庫與應用程序
- 5. 你可以在C++程序中創建一個.java文件嗎?
- 6. 你可以讓一個C#應用程序自動添加帖子給Yammer嗎?
- 7. 一個c#控制檯應用程序也可以作爲一個類庫嗎?
- 8. C#WinForm應用程序可以使用遠程MySQL連接嗎?
- 9. 你可以在一個.NET應用程序中SSL一頁嗎?
- 10. 你可以從C/C++調用Objective-C方法嗎?
- 11. 我可以使用應用程序作爲庫(Mac,Objective-c)嗎?
- 12. 您可以將C++ Linux針對的應用程序鏈接到Objective-C靜態庫嗎?
- 13. 你可以靜態編譯一個cygwin應用程序嗎?
- 14. 你可以讓一個貼紙應用程序有聲音嗎?
- 15. 你可以用鏈接調用一個servlet嗎?
- 16. 鏈接一個C++應用程序再DLL一個
- 17. 你可以在Cocoa(Obj-C)項目中使用C++庫嗎?
- 18. 如何鏈接SunriseDD C庫與C++應用程序?
- 19. 如何靜態鏈接C/C++應用程序中的庫?
- 20. 從Qt應用程序鏈接到C++靜態庫
- 21. 你可以在Dart應用程序中使用Java庫嗎?
- 22. 我可以在C程序中使用C++庫嗎?
- 23. C/C++應用程序可以使用OpenCL嗎?
- 24. 鏈接一個C++庫:Restbed
- 25. 你可以從C結構與位域創建一個NSValue嗎?
- 26. 您可以在C++/CLI WinForms應用程序中本地使用C++庫嗎?
- 27. 我可以在C++ 11客戶端應用程序庫中使用C++ 14嗎?
- 28. C++靜態庫可以鏈接到共享庫嗎?
- 29. 鏈接C++庫,以便它可以調用C
- 30. 你可以從C DLL調用C#DLL嗎?
在我的測試中,我需要添加'-lstdC++'來讓程序鏈接。 –