libstdc++適配Xcode10與iOS12


編譯報錯

當你開心得升級完新 macOS,以及新 XCode,准備體驗了一把 Dark Mode 編程模式,開心的打開自己的老項目的時候,發現編譯不通過了╮(╯_╰)╭

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

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

臨時解決辦法

  • 編譯問題

拷貝缺失的libstdc++

在 XCode10 正式發布前,XCode10 目前是 Beta 版,和 XCode9 正式版可以共存

於是從 XCode9 的目錄里,把缺失的 .tbd 文件拷貝過來,要記得拷貝2套,一套是模擬器的,一套是設備的,可以簡單的用下面的命令

1
2
3
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/

現在 XCode10 正式發布了,很多人已經沒有 XCode9 來拷貝了,於是這里放出來文件提供下載

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

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

 

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

  • 模擬器運行

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

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

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

 

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

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

 

  • 真機運行

拷貝 libstdc++ 之后,使用 iOS12 的真機運行,沒有啥太大的問題

正確解決辦法

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

libc++

Apple 為什么在 Mavericks 里把 C++ 標准庫從 libstdc++ 改成 libc++?

其他關於此問題的討論

Xcode10和iOS12踩坑

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM