一、building for iOS Simulator, but linking in object file built for iOS, xxxx for architecture arm64
原項目遷移到 Xcode 12 運(yùn)行模擬器的時候出現(xiàn)報錯蔗坯,在真機(jī)可正常運(yùn)行
- 在 Xcode 11 中汁咏,我們通過
Build Setting -> Architectures -> Valid Architectures
中填寫支持的指令集 - 在 Xcode 12 中前鹅,
Valid Architectures
這一項被移除掉了,替換成User-Defined
中的VALID_ARCHS
區(qū)別在于 Xcode 11 中 x86_64
是默認(rèn)添加的,就算不填寫也是默認(rèn)支持澈魄,但是在 Xcode 12 中默認(rèn)不添加 x86_64
采章,需要手動加入
二运嗜、 in XXX.a(XXXXXXX.o), building for iOS Simulator, but linking in object file built for iOS, for architecture arm64
靜態(tài)庫工程編譯模擬器庫報錯,該提示說明該庫不支持模擬器 arm64
悯舟,需要在 Build Setting -> Excluded Architectures
添加 Any iOS Simulator SDK
對應(yīng)值為 arm64
如何在 cocoapods 中移除 arm64
在 profile 中添加下面代碼
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
end
end
三担租、have the same architectures (arm64) and can't be in the same fat output file
Xcode 12 之前
- 編譯模擬器靜態(tài)庫支持
i386
、x86_64
兩個架構(gòu) - 編譯真機(jī)靜態(tài)庫支持
armv7
抵怎、arm64
兩個架構(gòu) - 我們一般將
lib -create -output
命令將兩個庫合并成一個奋救,支持四種架構(gòu)的庫
Xcode 12 編譯的模擬器靜態(tài)庫新增支持 arm64
岭参,導(dǎo)致和真機(jī)靜態(tài)庫不能合并的問題
需要忽略掉模擬器編譯的 arm64
,在 Build Setting -> Excluded Architectures
添加 Any iOS Simulator SDK
對應(yīng)的值為 arm64
針對已打包好的 .a 或 .framework
lipo XXX.a -remove arm64 -output XXX.a
四尝艘、The linked library 'xxxx.a/Framework' is missing one or more architectures required by this target: armv7.
在 Target
-> Build Setting
-> Exculded Architectures
中添加如下代碼
EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64=arm64 arm64e armv7 armv7s armv6 armv8 EXCLUDED_ARCHS=$(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))
五演侯、Could not find module 'XXXX' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator in Swift Project?
在 M1 芯片的 Xcode 中模擬器會使用 arm64 架構(gòu)運(yùn)行,非 M1 芯片的模擬器架構(gòu)為 x86_64背亥,如何讓 M1 芯片使用舊模式運(yùn)行秒际,在 Xcode -> 簡介(Get Info) -> 打開使用 Rosetta(Open using Rosetta)
Rosetta
關(guān)于官方對 Rosetta 的解釋 About the Rosetta Translation Environment,簡言之 Rosetta 是向 Apple 芯片的一個過渡模式狡汉,是一個翻譯過程娄徊,如果可執(zhí)行文件包含 Intel 指令,macOS 啟動 Rosetta 進(jìn)行翻譯盾戴,翻譯完成后寄锐,系統(tǒng)會啟動已翻譯的可執(zhí)行文件來代替原始文件,這個過程會影響性能
默認(rèn)使用蘋果芯片捻脖,打開 Rosetta 說明應(yīng)用程序僅支持英特爾處理器锐峭,需要 Rosetta 才能在任何配置 Apple Silicon 的 MAC 上運(yùn)行
架構(gòu)分離 & 合并 & 查看指令
以 framework 為例子
# 分離出 arm64 和 armv7
lipo xxxx.framework/xxxx -thin arm64 -output xxxx.framework/xxxx-arm64
lipo xxxx.framework/xxxx -thin armv7 -output xxxx.framework/xxxx-armv7
# 合并分離出兩種架構(gòu)
lipo -create xxxx.framework/xxxx-armv7 xxxx.framework/xxxx-arm64 -output xxxx.framework/xxxx
# 查詢 framework 支持哪些架構(gòu)
libo -info xxxx.framework/xxxx