自己的APP項目论熙,M1芯片電腦隔盛,在iOS 11系統(tǒng)的模擬器可以運行,iOS 11的真機破托、iOS15的真機可以運行,但是 iOS15模擬器運行報錯:
Undefined symbols for architecture arm64:
或者
Framework not found XXX
問題排查的經(jīng)過:
1. 新建一個項目诵闭,不裝pod的情況下炼团,iOS 11
和iOS 15
的模擬器
都是可以運行的澎嚣。
2. 新建一個項目疏尿,裝pod,不引入任何pod庫的情況下易桃,iOS 11模擬器
運行成功后褥琐,切換到iOS 15模擬器
運行失敗,Xcode 執(zhí)行clean之后晤郑,iOS 15模擬器
能運行成功敌呈,但切換到iOS 11設備的模擬器后運行失敗。報錯信息:
iOS 11模擬器不能運行報的錯:x86_64缺失
The linked framework 'Pods_xxx.framework' is missing one or more architectures required by this target: x86_64.
iOS 15不能運行報的錯: arm64缺失
The linked framework 'Pods_xxx.framework' is missing one or more architectures required by this target: arm64.
這個問題的解決辦法是:修改Pods 的設置Build Active Architecture Only
中Debug為NO造寝,執(zhí)行clean之后都能運行了(項目本身的設置也要這樣設置)磕洪。但是我們一般不這樣做,我們應該在選擇運行到低版本模擬器時手動clean一下再運行诫龙,因為這樣設置后活躍的Active的架構才去編譯析显,代碼編譯的速度會更快。
3. 確認了“2”中的修改方法后签赃,我的項目仍然不能跑起來谷异,于是在設置中看到Excluded Architecture
里面寫了arm64
,即除了arm64
以外的架構锦聊,所以我把這個設置去掉之后就變得可以運行了歹嘹。
使用上述操作的話,我們再次執(zhí)行pod install
之后孔庭,設置又改回去了尺上,所以我們最終的解決辦法是在Podfile中加上
inhibit_all_warnings!
install! 'cocoapods',
disable_input_output_paths: true, #pod庫每次修改代碼,主工程無需再次pod install就能看到代碼
generate_multiple_pod_projects: true # 讓每個pod依賴庫成為一個單獨的項目引入,這樣大大提升了編譯速度
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = ""
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'
if config.name == 'Debug'
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
else
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
end
end
end
end
end
4. 上述操作下如果存在有的pod導入運行不了怎抛,報錯
building for iOS Simulator, but linking in object file built for iOS, for architecture arm64
==》 翻譯:為iOS模擬器構建仰税,但在為iOS構建的對象文件中鏈接,用于架構arm64抽诉。
那么這就是我們上一步中去掉了排除了arm64
導致的陨簇,所以我們遇到這個情況需要項目工程和pod工程都排除arm64
。做法就是項目工程中的設置Excluded Architecture
中模擬器SDK為arm64
迹淌,如下圖河绽,上述的Podfile中的下面這句需要改為:
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
然后再次pod install
后clean一下,可以運行了唉窃。
如果項目中還有推送擴展等其它的工程的話耙饰,也是要跟主工程一樣設置架構。
我們根據(jù)報錯情況來選擇3或者4的方法讓自己項目能跑起來纹份!
如果能運行的話苟跪,也可以試著去掉podfile
中下面代碼, 如果能運行的話,就不用下面的了蔓涧。
if config.name == 'Debug'
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
else
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
end
5. 對于庫的編寫者的podspec文件寫法
podspec文件應該添加下面的行
s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
6. 真機設置的架構情況
- i386是針對intel通用微處理器32位處理器
- x86_64是針對x86架構的64位處理器
- 模擬器32位處理器測試需要i386架構
- 模擬器64位處理器測試需要x86_64架構
- 真機32位處理器需要armv7,或者armv7s架構
- 真機64位處理器需要arm64架構
參考閱讀
Xcode12 Build For ios Simulator arm64
Podfile語法參考
開啟 Cocoapods 新選項件已,加快項目索引速度