2015-09-26 84 views
2

我很難配置一個iOS項目,它使用一個靜態庫鏈接到gcc使用的舊libstdC++。該庫是32位和64位。在iOS項目中混合stdC++和libC++

有6個庫(例如libssl.a),它們是32位的,必須更新。如果我從源代碼編譯這些庫,它們將自動與libC++鏈接,這會導致我的鏈接器抱怨。

因此,這裏是我的問題:

1)有沒有什麼辦法有項目中使用的libstdC++裏面一個靜態庫,並有其他人使用的libC++?

2)如何從源代碼編譯庫(如libcrypto和libssh)並強制它們使用舊的libstdC++標準庫?

3)有沒有其他辦法擺脫這個混亂?

回答

4

1)是的,只要這些單獨的模塊之間沒有實際傳遞對象,您當然可以混合使用C++代碼使用的C++運行時。例如,如果你的應用中有兩個模塊只是公開C API,但在內部使用C++,那麼每個模塊都可以使用他們想要的任何C++運行時。嘗試在運行時間之間共享對象時會出現問題。

2)編譯和鏈接時,可以使用'--stdlib = libstdC++'或'--stdlib = libC++'命令行參數指定要使用哪個C++庫。如果最終的可執行文件需要與兩者鏈接,則需要手動指定另一個(例如:--stdlib = libC++ -lstdC++)。 3)是的,但請注意,libstdC++在幾年前不推薦使用,甚至在watchOS和tvOS上都不可用,所以最好的辦法就是將所有東西都轉換爲libC++。

+0

謝謝。那是我正在尋找的答案。你知道是否存在一個命令行參數來鏈接一個庫,然後只爲這個庫指定stl版本? – csotiriou

+0

編譯單個源文件時,需指定您正在使用哪個C++運行時,編譯器將爲該運行時使用適當的STL。那就是在編譯時使用--stdlib = libC++或--stdlib = libstdC++。在鏈接時,--stdlib = ...參數只是映射到適當的庫鏈接;這就是爲什麼你需要在鏈接時手動指定另一個。 –

2

只要不混合對象(如將一個庫中的字符串傳遞給需要不同類型字符串的函數),您可以在構建頂級應用程序時包含這兩個庫。

在我的情況下,它的工作方式是將標準C++ lib設置爲GNU版本,然後像添加任何其他系統庫一樣添加libC++。