iOS-制作.a静态库SDK和使用.a静态库

来源:互联网 发布:php采集器 代码 编辑:程序博客网 时间:2024/06/07 11:09

一、创建静态项目

创建一个新的工程,选择Framework & Library下面的Cocoa Touch Framework

这里写图片描述



二、在静态库中添加内容

这里,我就把我自己平时封装的一个工具类拖进来。

这里写图片描述


三、设置对应的参数

  • Build Active Architecture Only选项设置
    Build Setting里面的Build Active Architecture Only设置为NOBuild Active Architecture Only设置为YES时,是为了debug的时候编译速度更快,此时它只编译当前的architecture版本。设置为NO时,会编译所有的版本。

这里写图片描述


  • Debug版本和Release版本的切换

    这里,我要讲一下DebugRelease版本的区别。

    Debug是调试版本,主要让程序员使用。在调试的过程中Debug会启动更多的服务来监控错误,运行速度较慢,而且比较耗能。

    Release是发布版本,主要让用户使用,在使用的过程中会去掉那些繁琐的监控服务,运行速度相对较快,而且比较节约内存。

    这里,我们在Debug版本和Release版本下,使用模拟器和真机进行编译,生成DebugRelease模拟器和真机版本的静态库。

这里写图片描述

这里写图片描述

这里写图片描述


四、查看生成的静态库

直接点击静态库,然后Show In Finder,就显示出你的静态库所在路径。此时,你会发现,已经生成了DebugRelease版本下模拟器和真机类型的.a静态库。

这里写图片描述


五、合并静态库

经过我实践证明,Release版本下的真机和模拟器类型的静态库可以合并,当然Debug版本下的真机和模拟器类型的静态库也可以合并。但是,ReleaseDebug版本下的静态库不能互相合并。如果小弟哪个地方错了,大神们请指教。

查看静态库设备支持类型:lipo -info 静态库路径

合并静态库:lipo -create 静态库1的路径 静态库2的路径 -output 要生成的静态库路径+静态库名称


六、使用静态库

直接把生成的.a库拖到Xcode里面来,然后在Bulid Phases-->Link Binary With Libraries里面添加你的库

注意把头文件也导进来,不然你没法用。

这里写图片描述

这里写图片描述


七、可能遇到的问题

情况一:

当你打包静态库的时候,你的文件里面可能用到动态库,比如libz.tbd这个库。这时候直接Command+B编译生成库文件会报错,iOS 9之后,不能用libz.tbd这个了,换另种方式。

方法:

Go to Build Phases >Link Binary with Librairies > + > Add other

这里写图片描述

这里写图片描述

这里写图片描述



情况二:

当你的静态库中用到自定义的控件或者分类时候,你会发现,导入静态库的时候,你的工程会报错。

解决办法:
Build Setting—>Other Linker Flags 选项添加:-all_load 或者 -ObjC。至于这两个参数有什么区别,请参考:关于Xcode的Other Linker Flags



情况三:

这里,小弟不才,对静态库的理解不深。我只是知道,你的静态库中使用到其他的库时候(比如framework或者.a库),当你编译好你的静态库时候,把你的静态库导入到新的工程里面,你还是需要在新的工程把你刚才静态库里面用到的库再导入一遍。

也就是说,静态库只会编译你的代码,你导入的库并不会一并编译成静态库。举个例子,我的项目集成了讯飞语音的SDK,虽然我在静态库里面已经导入了讯飞语音的SDK,但是我把我的静态库导入到新的工程来用时候,发现如果不重新导入一遍之前的库,会报错。

再举一个例子,即使你导入了讯飞语音的SDK,讯飞语音的指导书里也说了,你还需要导入12个framework库,由此可见,静态库只是编译你的代码而已。至于库,还是由APP工程来导入才合理。



情况四:

不得不说,是因为我在Xcode 9里面呆的太久了,以至于我回到实际项目开发中,都还在用Xcode 9来开发。那么就会遇到一个问题:Xcode 9里面编译静态库后,是不能用于iOS 10的真机的,但是可以用于模拟器。(具体什么原因,暂时还没弄清楚)。

也就是说,你要在iOS 10里面用静态库,那么这个静态库必须是Xcode 8编译出来的静态库。

不过,距离Xcode 9正式发布还有2天,目前还是GM版的。不管啦,等Xcode 9正式发布,再去重新下载。