編譯報錯
報錯信息.png
開心得升級完新 macOS,以及新 XCode,準備體驗了一把 Dark Mode 編程模式,開心的打開自己的老項目的時候,發(fā)現(xiàn)編譯不通過了,報錯,
發(fā)現(xiàn)缺失爆紅.png
工程中如果依賴 libstdc++缀蹄,無論是你本身的功能用 C++ 跨平臺編寫,還是你引入了某個 SDK 其內(nèi)部依賴這個 libstdc++,都會導(dǎo)致整個工程編譯不通過膘婶,報出 Undefined symbols缺前,C++ 的 List 找不到了,
原因是蘋果在 XCode10 和 iOS12 中移除了 libstdc++ 這個庫,由 libc++ 這個庫取而代之悬襟,蘋果的解釋是 libstdc++ 已經(jīng)標記為廢棄有5年了衅码,建議大家使用經(jīng)過了 llvm 優(yōu)化過并且全面支持C++11的 libc++ 庫。
臨時解決辦法
- 編譯問題
拷貝缺失的libstdc++
在 XCode10 正式發(fā)布前古胆,XCode10 目前是 Beta 版肆良,和 XCode9 正式版可以共存
于是從 XCode9 的目錄里,把缺失的 .tbd 文件拷貝過來逸绎,要記得拷貝2套惹恃,一套是模擬器的,一套是設(shè)備的棺牧,可以簡單的用下面的命令
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/
現(xiàn)在 XCode10 正式發(fā)布了巫糙,很多人已經(jīng)沒有 XCode9 來拷貝了,于是這里放出來文件提供下載
將 libstdc++.6.0.9.tbd.zip 解壓颊乘,放到目錄
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
查看是否存在.png
拷貝過去后参淹,你就可以在新 XCode(黑暗模式真心舒服)下面看到libstdc++了,放心的添加到工程里吧
- 模擬器運行
image.png
拷貝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/
- 真機運行
拷貝 libstdc++ 之后瓦戚,使用 iOS12 的真機運行沮尿,沒有啥太大的問題
正確解決辦法
- 如果你自己的業(yè)務(wù)模塊使用了 libstdc++ ,那么就把模塊代碼重新調(diào)整為依賴 libc++ 较解,然后重新檢查是否存在問題畜疾,重新編譯
- 如果你引用的三方庫使用了 libstdc++ ,那么向三方庫尋求支持哨坪,進行升級
libc++
Apple 為什么在 Mavericks 里把 C++ 標準庫從 libstdc++ 改成 libc++庸疾?