为何M1 Mac上Framework测试失败,可执行文件测试却正常?
问题描述
维护2013年的旧项目时遇到以下异常现象:
- 项目里的framework附带测试用例,开发者配置了
excluded architectures: Any iOS Simulator SDK arm64编译参数。 - 在M1 Mac上,不启用Rosetta模拟器运行测试会触发链接错误,必须切换到Rosetta才能正常执行;但在Intel Mac上可以原生运行。
- 若把该framework改成App(可执行文件),用相同的测试用例,哪怕在M1 Mac上不勾选Rosetta模拟器,测试也能正常通过,这和预期的失败结果不符。
问题解答
一、Framework与App的底层差异
架构匹配逻辑不同
- App作为可执行文件,M1 Mac上的iOS模拟器会自动检测到它仅包含x86_64架构,自动通过Rosetta转译运行,无需手动勾选Rosetta选项。
- Framework是动态库,M1 Mac上的测试目标默认会编译为arm64原生架构,它尝试链接仅支持x86_64的framework时,架构不匹配直接触发链接错误,不会触发自动转译。
测试目标的编译行为差异
- App的测试目标依附于App本身,当App是x86_64架构时,测试目标会同步编译为x86_64,自然能匹配运行。
- Framework的测试目标是独立编译的,M1 Mac下默认采用arm64架构,和仅支持x86_64的framework架构不兼容,因此出现链接错误。
二、让Framework测试无需切换Rosetta的解决方法
- 统一测试目标与Framework的架构:给测试目标也添加
excluded architectures: Any iOS Simulator SDK arm64配置,让测试目标只编译x86_64架构,和framework架构匹配后,系统会自动通过Rosetta转译运行,无需手动切换。 - 编译通用架构:如果项目允许,直接删除
excluded architectures里的arm64排除配置,让framework编译成同时包含x86_64和arm64的通用二进制包,这样M1 Mac上的测试目标可以原生arm64运行,直接匹配framework的arm64切片。 - 强制测试目标用Rosetta运行:在测试Scheme的Run设置中,勾选"Use Rosetta for Run destination",让测试目标强制通过Rosetta转译运行,适配x86_64的framework。
内容的提问来源于stack exchange,提问作者MegaManX
相关产品推荐
相关产品推荐

