編譯報錯
開開心心的升級完新 macOS辖源,以及新 XCode蔚携,準(zhǔ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++ 庫移必。
解決方法
真機編譯
下載文件
將 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 在模擬器里一運行就崩潰入篮,就會報動態(tài)鏈接庫裝載出錯,看出錯提示說是 .dylib 與這個模擬器不符合幌甘。這是 XCode10 自帶的 iOS12 模擬器的問題潮售,在 XCode10 中安裝 iOS11 的模擬器運行環(huán)境,然后切換到 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/
大功告成
這時模擬器真機都可以正常跑起來了,讓我們一起搖擺忘巧。恒界。。袋坑。
但是這種方法只是臨時解決仗处,蘋果官方爸爸是不希望咱們這么干的
正確解決辦法
- 如果你自己的業(yè)務(wù)模塊使用了
libstdc++
,那么就把模塊代碼重新調(diào)整為依賴libc++
枣宫,然后重新檢查是否存在問題婆誓,重新編譯 - 如果你引用的三方庫使用了
libstdc++
,那么向三方庫尋求支持也颤,進(jìn)行升級
libc++
Apple 為什么在 Mavericks 里把 C++ 標(biāo)準(zhǔn)庫從 libstdc++ 改成 libc++洋幻?
其他關(guān)于此問題的討論
或者以下為 拷貝命令 Xcode-beta 為 10 Xcode 為 9
cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/