问题描述:
最近封装公司私有库FrameWork 提供给业务端同事使用,结果同事引入FrameWork 后打包出现找不到FrameWork 里面头问文件. 报错信息为:Could not find module 'XXXFramework' for target 'armv7-apple-ios'; found: arm64, arm64-apple-ios.
问题原因:
生成FrameWork时缺少 armv7-apple-ios 指令结构.
问题解决:
修改FrameWork Targers 的Build Setting 里 Build Active Architecture Only YES 改为 NO . 重新编译生成FrameWork.
问题解决过程:
1、开始考虑的是否是真机模拟器没有合并.合并后依然存在问题.
2、因为有的同事的机器上能打包成功.唯独m1机器打包不成功.感觉是缺什么指令集
3、查看FrameWork 输出支持的框架,发现只支持arm64 和 armv7. 修改Build Active Architecture Only YES 改为 NO . 成功
**iOS 设备的CPU架构**
1.1、 在模拟器上支持:
模拟器32位处理器 iPhone4s-5: i386 架构
模拟器64位处理器 iPhone5s-8 Plus:x86_64 架构
(ios模拟器没有arm指令集)
1.2、在真机设备上支持:
真机32位处理器:armv7、armv7s
真机64位处理器:arm64
armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
armv7s:iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)
arm64: iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3
1.3、ARM处理器指令集
几乎所有手机处理器都基于ARM处理器的,ARM处理器特点是体积小、低功耗、低成本、高性能,所以在嵌入式系统中应用广泛.
armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的比如设备是armv7s指令集,那么它也可以兼容运行比armv7s版本 低的指令集:armv7/armv6,只是无法体现armv7s的新版本特性。Xcode 4.5起不再支持armv6。真机32位处理器需要armv7或者armv7s架构,真机64位处理器需要arm64架构.
1.4、i386|x86_64 指令集:i386和x86_64 是Mac处理器的指令集
i386是针对intel通用微处理器32位处理器的
x86_64是针对x86架构的64位处理器
所以当使用iOS模拟器的时候会遇到i386|x86_64(ios模拟器没有arm指令集)
命令查看静态库支持的架构:
通过 lipo -info - 》 拖入模拟器或者真机.framework的路径 查看静态库支持的架构(以下是终端命令)
$ lipo -info - .framework的路径。
Architectures配置
Additional SDKs
编译时附加的SDK,这些SDK必须是附加的,不应该是整个框架的SDK,并且多个SDK的时候,第一个SDK有最高优先级。
Architectures
指定/想要工程支持的指令集,默认会由系统生成预定义的指令集,现在Xcode默认是Standard architectures(armv7和arm64的合集),如果想要支持其他指令集,可以手动添加。而支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包会越大。
Base SDK
指的是当前编译所用的SDK版本。Base SDK设置会引导编译器使用该版本的SDK编译和构建应用,会直接控制应用使用哪些API。默认情况下,Xcode中创建的新工程总是使用最新版本的SDK,而苹果会处理API的废弃。
Build Active Architecture Only
设置是否只编译当前使用的设备对应的arm指令集。
设置成YES时,如果连上一个arm64指令集的设备,就算Valid Architectures和Architectures都设置成armv7/armv7s/arm64,依然只会生成一个arm64指令集的二进制包(前提是Xcode必须连接了调试设备,否则还是编译Valid Architectures和Architectures指定的二进制包)。通常情况下,该编译选项在Debug模式设置成Yes,Release模式设置成No,打包静态库除外,下面会解释。
Valid Architectures
有效的指令集集合,通常为所有指令集,表示工程支持的处理器类型,不需要开发者更改,但有时候会因为一些因素,如工程使用了非开源的库,而此库只支持部分处理器类型,导致工程也不是所有的处理器都支持。
该列表和Architectures列表的交集是Xcode最终生成二进制包所支持的指令集,因此不能为空。
Supported Platform
指定支持的设备平台