天天看點

适配Xcode10與iOS12之libstdc++問題

适配Xcode10與iOS12之libstdc++問題

開開心心的更新完新 macOS,以及新 XCode,準備體驗了一把 Dark Mode 程式設計暗黑模式,快樂的打開自己的項目的時候,發現編譯不通過了。。。。。

心裡一群草泥馬跑過去。。。。。。

後來調查了一下發現:

如果你的工程中如果依賴 libstdc++,無論是你本身的功能用 C++ 跨平台編寫,還是你引入了某個 SDK 其内部依賴這個 libstdc++,都會導緻整個工程編譯不通過,報出 Undefined symbols,C++ 的 List 找不到了

原因是蘋果在 XCode10 和 iOS12 中移除了 libstdc++ 這個庫,由 libc++ 這個庫取而代之,蘋果的解釋是 libstdc++ 已經标記為廢棄有5年了,建議大家使用經過了 llvm 優化過并且全面支援C++11的 libc++ 庫。

解決方法

下載下傳檔案

将 libstdc++.6.0.9.tbd.zip 解壓,放到目錄

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/

拷貝過去後,你就可以在新 XCode(黑暗模式666666)下面看到libstdc++了,放心的添加到工程裡吧

模拟器編譯報錯

但是,執行上面操作後,模拟器還是不行

報錯:

模拟器報錯

拷貝libstdc++之後就可以編譯通過了,但 App 在模拟器裡一運作就崩潰,就會報動态連結庫裝載出錯,看出錯提示說是 .dylib 與這個模拟器不符合。這是 XCode10 自帶的 iOS12 模拟器的問題,在 XCode10 中安裝 iOS11 的模拟器運作環境,然後切換到 iOS11 模拟器運作,一切問題沒有。

這裡劃重點哦。。。。

如果想在 XCode12 iOS12 模拟器中運作:

将 libstdc++_sim.zip 解壓,放到目錄

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/

将 libstdc++.dylib_sim.zip 解壓,放到目錄

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/

大功告成

這時模拟器真機都可以正常跑起來了,讓我們一起搖擺。。。。

但是這種方法隻是臨時解決,蘋果官方爸爸是不希望咱們這麼幹的

正确解決辦法

如果你自己的業務子產品使用了 libstdc++ ,那麼就把子產品代碼重新調整為依賴 libc++ ,然後重新檢查是否存在問題,重新編譯

如果你引用的三方庫使用了 libstdc++ ,那麼向三方庫尋求支援,進行更新

繼續閱讀