適配Xcode10與iOS12之libstdc++問題

編譯報錯

libstdc++問題

開開心心的升級完新 macOS,以及新 XCode,準(zhǔn)備體驗(yàn)了一把 Dark Mode 編程暗黑模式,快樂的打開自己的項目的時候,發(fā)現(xiàn)編譯不通過了。。。。。

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

后來調(diào)查了一下發(fā)現(xiàn):

如果你的工程中如果依賴 libstdc++,無論是你本身的功能用 C++ 跨平臺編寫,還是你引入了某個 SDK 其內(nèi)部依賴這個 libstdc++,都會導(dǎo)致整個工程編譯不通過,報出 Undefined symbols,C++ 的 List 找不到了

原因是蘋果在 XCode10 和 iOS12 中移除了 libstdc++ 這個庫,由 libc++ 這個庫取而代之,蘋果的解釋是 libstdc++ 已經(jīng)標(biāo)記為廢棄有5年了,建議大家使用經(jīng)過了 llvm 優(yōu)化過并且全面支持C++11的 libc++ 庫。

解決方法

真機(jī)編譯

下載文件
libstdc++.6.0.9.tbd.zip 解壓,放到目錄

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

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

模擬器編譯報錯

但是,執(zhí)行上面操作后,模擬器還是不行
報錯:


模擬器報錯

拷貝libstdc++之后就可以編譯通過了,但 App 在模擬器里一運(yùn)行就崩潰,就會報動態(tài)鏈接庫裝載出錯,看出錯提示說是 .dylib 與這個模擬器不符合。這是 XCode10 自帶的 iOS12 模擬器的問題,在 XCode10 中安裝 iOS11 的模擬器運(yùn)行環(huán)境,然后切換到 iOS11 模擬器運(yùn)行,一切問題沒有。

這里劃重點(diǎn)哦。。。。

如果想在 XCode12 iOS12 模擬器中運(yùn)行:

  1. libstdc++_sim.zip 解壓,放到目錄
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/
  1. libstdc++.dylib_sim.zip 解壓,放到目錄
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/
大功告成

這時模擬器真機(jī)都可以正常跑起來了,讓我們一起搖擺。。。。
但是這種方法只是臨時解決,蘋果官方爸爸是不希望咱們這么干的

正確解決辦法

  • 如果你自己的業(yè)務(wù)模塊使用了 libstdc++ ,那么就把模塊代碼重新調(diào)整為依賴 libc++ ,然后重新檢查是否存在問題,重新編譯
  • 如果你引用的三方庫使用了 libstdc++ ,那么向三方庫尋求支持,進(jìn)行升級

libc++

Apple 為什么在 Mavericks 里把 C++ 標(biāo)準(zhǔn)庫從 libstdc++ 改成 libc++?

其他關(guān)于此問題的討論

Xcode10和iOS12踩坑

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容