iOS 静态库-因为CPU架构引起的小问题
前言
最初 AppStore 不允许自制动态库的上传(但在14年的WWDC上开放了动态库),动态库与静态库的架构例子基本一样的。本文的内容是没什么难度的,避免在后续的开发中忽略掉这个问题,只是做一个记录。
问题
首先看一下在下面图中Xcode的报错问题:
这个错误其实比较常见了,通过Undefined symbols for architecture x86_64
发现它的意思是:没有这个x86_64
的architecture
(架构)。图中的"_OBJC_CLASS_$_Scorpio", referenced from:
的Scorpio
就是我打包出来的静态库,这个静态库分为2种,一个是真机另一个是模拟器如下图:
导入到项目中的是真机环境下的静态库,而项目是在模拟器环境下编译的,所以才会报错。
iOS的CPU架构简单说明
其实不用去真正理解CPU架构,只要明白不同的iPhone设备,它都是有不同的CPU架构(也有相同的),我们开发的App都会在不同的CPU架构下运行。当编译时,Xcode会先看看你是在模拟器还是在真机,然后确定CPU架构,最后在明确你的静态库支不支持这个CPU架构,如果不支持编译就会报错。
来看一下iPhone设备的CPU架构(iPhone 7 Plus还不确定):
可以通过lipo -info libScorpio.a
(libScorpio.a就是你得静态库)命令行来查看静态库当前支持的架构,随便找个第三方SDK (例如:个推推送) 来看看:
注意:只要支持armv7
就不用再支持armv7s
个推推送的静态库是支持所有的CPU架构,它的做法就是把真机与模拟器的静态库,合并成一个静态库(合并的方法不多解释,相信大家都会)。这种做法的缺点就是静态库会很大,最好的办法就是提供2种文件给我们使用,一个是真机一个是模拟器,在App上线我们只需要真机的静态库。
静态库可以是.a
或者.framework
,现在我们的静态库一般都用.framework
,这两种支持CPU架构的方法都是一样的。