您的位置:时时app平台注册网站 > 编程知识 > iOS 静态库-因为CPU架构引起的小问题时时app平台注

iOS 静态库-因为CPU架构引起的小问题时时app平台注

2019-09-14 00:42

时时app平台注册网站 1

一、静态库与动态库存在的形式

1、静态库:.a  或者 .framework

2、动态库:.tbd(Xcode 7以后.dylib变成.tbd) 或者.framework (顺便提一下,如果使用了动态库,上架会被拒绝)

![](https://upload-images.jianshu.io/upload_images/2457121-d42137cca89a5c0a.png)

屏幕快照 2018-01-28 上午10.01.51.png

注意:只要支持armv7就不用再支持armv7s

五、剖析静态库

1、不同的设备使用的CPU是不同的,CPU的不同照成使用的CPU架构(指令集)不同;静态库有其支持的CPU架构,如果静态库在不支持的CPU架构上运行就会报错。

模拟器使用的CPU架构: iPhone4s - iPhone 5: i386  iPhone5s - iPhone7plus :x86_64

真机使用的CPU架构: iPhone3GS - iPhone4s :armv7   iPhone5-iPhone5c:armv7s  iPhone5s- iPhone 7:arm64  (只要支持了armv7的静态库可以在arm64上正常运行)

2、也就是说,我们选择了模拟器的时候编译出来的静态库在真机上是不能使用的,同理,真机编译出来的静态库是不能在模拟器上使用的。这就可以知道我们上面报错的原因了,同样我们也可以解决错误了

  1. 支持所有模拟器的cpu架构

首先看一下在下面图中Xcode的报错问题:

二、静态库和动态库的区别

1、静态库 :链接时,静态库被完整地复制到可执行文件中,被多次使用就有多次冗余拷贝 例如:多个程序都用到了百度地图的静态库那就被多次拷贝

2、动态库:链接时不复制,程序运行时由系统动态地加载到内存中,由程序调用,系统只加载一次,多个程序共用,节省内存  例如:多个程序都用到了UIKit,那多个程序就共用一个动态库

时时app平台注册网站 2

时时app平台注册网站 3

四、使用静态库

1.现在我将模拟器编译出来的静态库拖到新建的一个工程中使用,注意是模拟器编译出来的静态库,使用静态库的结果如图:

时时app平台注册网站 4

模拟器编译出来的包在模拟器上运行的结果

可以看到,我们确实是可以使用模拟器编译出来的静态库了。这个时候,我们来试试,

真机编译出来的静态库在模拟器上来使用,下面是运行的结果,如图:

时时app平台注册网站 5

真机编译出来的静态库在模拟器上使用的结果

这个时候,出现了一个 not fount for architecture x86_64 这样的错误。下面我们来讲讲为什么会出现这样的情况,怎么解决这样的情况

静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝。文件后缀:.a或者.framework

时时app平台注册网站 6

七、边制作静态库边调试

按照前面我们所讲的方式创建的静态库在Xcode上是不能运行调试的,如果我们想边制作静态库边调试的话,可以采用下面的这种方式,如图:

时时app平台注册网站 7

边制作静态库边调试

3.暴漏头文件
TAGETS -> Build Phases ->Copy Files 添加头文件Tool.h

时时app平台注册网站 8

三、制做静态库

1.创建一个静态库(笔者创建的是.a的静态库)

时时app平台注册网站 9

制作静态库

2.编写静态库,如:

时时app平台注册网站 10

编写代码

3、如果想使用静态库必须将一些.h的头文件暴露出来供自己或者别人使用,下面是添加需要暴露出来的头文件的方法:

时时app平台注册网站 11

添加需要暴露出来的头文件

3、然后你就可以选择哪些文件需要暴露出来

4、选择模拟器如iPhone 6s编译 或者选择真机(也可以选择Generic iOS device)编译,这个时候就会出现模拟器编译出来的.a静态库和真机编译出来的静态库。 这个时候,你可以在左边的目录中选择.a静态库,右击 show in finder 就可以查看静态库所在的位置了,如图:

时时app平台注册网站 12

查看静态库和暴露出来的头文件

屏幕快照 2018-01-28 下午3.49.42.png

导入到项目中的是真机环境下的静态库,而项目是在模拟器环境下编译的,所以才会报错。

六、使用终端命令查看静态库和合并两个静态库

1、使用命令:lipo -info 可以查看对应的静态库所支持的架构

2.、如果我们想静态库同时支持模拟器和真机上使用的话,我们可以将模拟器编译出来的静态库和真机编译出来的静态库合并,这样的话,就可以同时支持真机和模拟器了。使用命令 lipo -create    静态库1 静态库2 -output 合并两个静态库,下面是在终端上演示的截图,如图:

时时app平台注册网站 13

使用终端查看静态库支持的架构和合并两个静态库

时时app平台注册网站 14

个推推送的静态库是支持所有的CPU架构,它的做法就是把真机与模拟器的静态库,合并成一个静态库(合并的方法不多解释,相信大家都会)。这种做法的缺点就是静态库会很大,最好的办法就是提供2种文件给我们使用,一个是真机一个是模拟器,在App上线我们只需要真机的静态库。

  • 1、什么是CPU架构

可以通过lipo -info libScorpio.a(libScorpio.a就是你得静态库)命令行来查看静态库当前支持的架构,随便找个第三方SDK 来看看:

  1. Build Active Architecture Only
    指定是否只对当前连接设备所支持的指令集编译
    当其值设置为YES,这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本,而设置为no时,会编译所有的版本。 所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。

其实不用去真正理解CPU架构,只要明白不同的iPhone设备,它都是有不同的CPU架构,我们开发的App都会在不同的CPU架构下运行。当编译时,Xcode会先看看你是在模拟器还是在真机,然后确定CPU架构,最后在明确你的静态库支不支持这个CPU架构,如果不支持编译就会报错。来看一下iPhone设备的CPU架构(iPhone 7 Plus还不确定):

调试版本会包含完整的符号信息,以方便调试;
调试版本不会对代码进行优化;

这个错误其实比较常见了,通过Undefined symbols for architecture x86_64发现它的意思是:没有这个x86_64architecture。图中的"_OBJC_CLASS_$_Scorpio", referenced from:Scorpio就是我打包出来的静态库,这个静态库分为2种,一个是真机另一个是模拟器如下图:

时时app平台注册网站 15

静态库可以是.a或者.framework,现在我们的静态库一般都用.framework,这两种支持CPU架构的方法都是一样的。

![](https://upload-images.jianshu.io/upload_images/2457121-7df995a6787c2d36.png)

屏幕快照 2018-01-28 上午10.15.28.png

最初 AppStore 不允许自制动态库的上传(但在14年的WWDC上开放了动态库),动态库与静态库的架构例子基本一样的。本文的内容是没什么难度的,避免在后续的开发中忽略掉这个问题,只是做一个记录。

屏幕快照 2018-01-28 上午10.11.03.png

时时app平台注册网站 16

  • 2 、常见的架构
    armv7|armv7s|arm64都是ARM处理器的指令集;
    i386|x86_64 是Mac处理器的指令集。
    iOS模拟器没有运行ARM指令集,编译运行的是x86指令集(或i386),所以只有在iOS设备上才会执行设备对应ARM指令集。每个设备都有属于自己的CPU架构。

本文章首发地址:

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。文件后缀:.dylib或者.framework

2.Valid Architectures
限制可能被支持的指令集的范围,也就是Xcode编译出来的二进制包类型最终从这些类型产生,<b>而编译出哪种指令集的包,将由Architectures与Valid Architectures(因此这个不能为空)的交集来确定

屏幕快照 2018-01-28 上午10.07.23.png

"CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前市面上的CPU分类主要分有两大阵营,一个是intel、AMD为首的复杂指令集CPU,另一个是以IBM、ARM为首的精简指令集CPU。两个不同品牌的CPU,其产品的架构也不相同,例如,Intel、AMD的CPU是X86架构的,而IBM公司的CPU是PowerPC架构,ARM公司是ARM架构"(摘自百度)
通常,我们知道电脑的CPU架构有X86和X64等,但是手机的主流CPU架构是ARM架构,因为采用ARM架构的CPU是一种微处理器,这种处理器功耗低,体积小,更适合手机使用,iPhone的CPU也是如此。

注意:如果项目中使用自制的动态库,不能上传到appstore中,因此开发中使用的基本都是静态库。

时时app平台注册网站 17

发布版本不会包含完整的符号信息;
发布版本的执行代码是进行过优化的;
发布版本的大小会比调试版本的略小;
在执行速度方面,发布版本会更快些,但不意味着会有显著的提升;

屏幕快照 2018-01-28 上午10.18.54.png

时时app平台注册网站 18

时时app平台注册网站 19

![](https://upload-images.jianshu.io/upload_images/2457121-9038480cb1822e25.png)

屏幕快照 2018-01-28 上午10.55.02.png

6.生成支持真机的静态库

屏幕快照 2018-01-28 上午11.03.44.png

屏幕快照 2018-01-28 下午3.20.41.png

静态库文件的版本(4种)

  • 3终端命令查看静态库支持的架构:
    lipo -info xxxxxx.a (切换到.a的父文件夹下执行)

    lipo -info HisignFaceBaseSdk(切换到HignFaceBaseSdk的父文件夹下即HisignFaceBaseSdk.framework文件下,其实framework就是个文件夹)
    四、静态库的制作

lipo  -create Debug-iphoneos/liblibsttt.a Debug-iphonesimulator/liblibsttt.a -output libTools.a

 llipo -info libTools.a

Architectures in the fat file: libTools.a are: armv7 i386 x86_64 arm64 

静态库Realese版本生成:
Edit Scheme ->Run->Build Configuration->Release

连接上iphone设备Command B编译一下

时时app平台注册网站 20

五、静态库合并
在开发过程为了让静态库同时支持真机和模拟器方便调试,我们需要将iphones版本和iphonesimulator版本合并成一个静态库,既能支持模拟器,又能支持真机。

屏幕快照 2018-01-28 下午3.34.34.png

屏幕快照 2018-01-28 下午3.13.54.png

  1. 选择Coca Touch stair Libary点击next创建一个工程。

1244124-664cd726a222f057.png

总结:在编译静态库时,需要编译两个版本 -> 真机iphones版本(arm) | 模拟器和iphonesimulator版本(i386);
终端命令静态库支持的架构:lipo -info liblibstatic.a

终端命令:

时时app平台注册网站 21

![](https://upload-images.jianshu.io/upload_images/2457121-6a95f7921be8dfce.png)

屏幕快照 2018-01-27 下午9.42.52.png

一、概述
库就是程序代码的集合 是共享程序代码的一种方式;根据公开和不公开可分为:开源库和闭源库;我们经常使用的第三库像MJExtension、MJrefrsh、SDWebImge等都属于开源库;而闭源库是经过编译后的二进制代码,我们无法看到具体实现,比如说经常使用的百度SDk等。闭源库又可分为:静态库、动态库。

时时app平台注册网站 22

屏幕快照 2018-01-28 下午3.42.08.png

时时app平台注册网站 23

  1. Command B编译一下

时时app平台注册网站 24

三、Architectures (架构)
之所以提到CPU架构的问题,其实是因为我们iOS开发使用的静态库与动态库与之紧密相连。每一个开发的App都要运行在模拟器或者真机上,在编译的时候,Xcode需要去分析当前运行平台的CPU架构,然后确定所使用的静态库是否支持这个CPU架构。如果不支持就会报错。

屏幕快照 2018-01-28 下午3.50.06.png

  1. Architectures
    指定工程被编译成可支持哪些指令集类型,而支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包会变大。

时时app平台注册网站 25

二、静态库和动态库的区别

2.新建一个工具类

lipo -create 静态库1 静态库2 -output 新的静态库

屏幕快照 2018-01-28 下午3.11.12.png

本文由时时app平台注册网站发布于编程知识,转载请注明出处:iOS 静态库-因为CPU架构引起的小问题时时app平台注

关键词: