天天看点

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架构的方法都是一样的。

本文章首发地址:www.jianshu.com/p/f2a3e5027…