美文网首页iOSiOS Developer
iOS 静态库与动态库(制作和使用及其本质)

iOS 静态库与动态库(制作和使用及其本质)

作者: MonStar丶 | 来源:发表于2016-12-12 12:53 被阅读0次

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

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

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

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

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

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

    三、制做静态库

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

    制作静态库

    2.编写静态库,如:

    编写代码

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

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

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

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

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

    四、使用静态库

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

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

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

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

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

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

    五、剖析静态库

    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、使用命令:lipo -info 可以查看对应的静态库所支持的架构

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

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

    七、边制作静态库边调试

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

    边制作静态库边调试

    相关文章

      网友评论

        本文标题:iOS 静态库与动态库(制作和使用及其本质)

        本文链接:https://www.haomeiwen.com/subject/yrcymttx.html