問題症狀與解決
在 Xcode 7 beta 3 (7A152u) 中創建 Swift 項目,並使用 CocoaPods 做依賴管理,編譯時會遇到如下的報錯:
dyld: Library not loaded: @rpath/Pods.framework/Pods Referenced from: /private/var/mobile/Containers/Bundle/Application/26B91138-7483-40B0-9BE6-D27072472895/AppName.app/AppName Reason: image not found (lldb)
這個錯誤只在真機測試上遇到,模擬器沒有問題。
解決方案是點擊 target 的 Build Settings,切換到 All,搜索 bitcode,將其設置為 No,即可編譯通過。
Bitcode 介紹
當項目進行編譯時,Xcode 使用 clang 或者 swiftc 對項目進行編譯,然后交給 LLVM 來創建二進制的包,以適配虛擬機(x86/64)和真機(arm6/arm7/arm7s/arm64)環境。這樣得來的二進制包,被稱為“胖二進制包”(Fat Binary)。
如果啟用 Bitcode 的話,那么生成“胖二進制包”的過程會被去掉,LLVM 只會生成一個中間語言 bitcode 包。這么干是有不少好處的,但是就不能在所有環境運行了,所以后面一步打包工作總是需要有人來做的——App Store來干這個事兒。這樣一來,包體積更小,運行也更快了,也是 iOS9 “瘦身功能”的一部分。未來,所有的 WatchOS 應用會強制 bitcode 提交,但 iOS 應用還沒有這個要求。
參考
App Thinning (iOS, watchOS):
https://developer.apple.com/library/prerelease/watchos/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html
Fat Binary:
https://en.wikipedia.org/wiki/Fat_binary#Apple.27s_Universal_binary
LLVM:
https://zh.wikipedia.org/wiki/LLVM
Impact of Xcode build options “Enable bitcode” Yes/No:
http://stackoverflow.com/questions/31088618/impact-of-xcode-build-options-enable-bitcode-yes-no
Xcode 7 dyld:Library not loaded image not found:
https://github.com/CocoaPods/CocoaPods/issues/3661
dyld: Library not loaded: @rpath/Pods.framework/Pods
https://github.com/CocoaPods/CocoaPods/issues/3586