.a 文件静态库的制作

2018-11-09  本文已影响8人  那是一阵清风_徐来
导读

出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成库,只暴露出头文件以供使用。

库分静态库和动态库两种。

二次封装AF网络请求为例:如果代码里面不需要 AF,则导入AF 的时候,Add to targets. 不需要选择,这样才不会有引用,造成.a 文件与源文件冲突,造成的编译失败)

.a 和 .framework 两种形式。

.a 是一个纯二进制文件,.framework 中除了有二进制文件之外还有资源文件。
.a ,要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。
总的来说,.a + .h + sourceFile = .framework。
所以创建静态库最好还是用.framework的形式。

静态库,在链接时会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝。
好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。

动态库,与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。
系统的动态库不需要拷贝到目标程序中,自建的动态库可以由工程内的多个库共享,因此可以减小目标程序的体积。但是,由于其把静态链接做的事情都搬到运行时来做,程序的启动会变慢

静态库:
image.png

这里面的文件开发者可以自己去定义,删除、添加、修改、替换都可以。

注意: 要适配最低版本号

我们可以把需要做成 .a 文件的 相关文件放到工程目录下面。但是要执行第四步(target —> Build Phases —> Copy files )添加需要暴露的 .h 文件,如果不添加,可能也不会有什么问题,但是在 第五步的 Products —> Debug-iphonesimulator —> include 路径下只有一个默认的 .h 文件 如果你在静态库工程中使用了category,那么你可能会碰到链接问题,解决的办法就是需要同时在生成静态库的工程和使用静态库的工程中使用“-all_load”编译选项,即在对应target的"Build Settings"中的“Other Linker Flags”选项添加“-all_load”,注意:使用静态库的工程中是一定要加该编译选项的!至于生成静态库的工程中加不加没有试过,不过建议还是加上该编译选项。

此时的Products 文件目录下的 .a 文件 为红色,说明文件并不存在(show in finder 查看是没有的)

这个配置分为 Debug 模式(真机调试)、Release模式(发布appstore);
Yes 表示只编译选中模拟器设备对应的架构;
No 则为编译所有模拟器设备支持的cup架构(Debug、Release版本同理)

我们一般都选择NO

这部分在上面 也提及过(添加你需要暴露的接口头文件,放到同一个 文件Include 目录下),这里不解释了

这一步是选择模拟器或者真机
模拟器下: 说明 生成的 .a 文件可以在 模拟器上面使用,而不能在 真机 上使用;
真机下: 说明 生成的 .a 文件可以在 真机上面使用,而不能在 模拟器 上使用;

真正开发,需要在 模拟器、真机 都需要 分别编译一下,是否成功,查看Products 目录下的 .a 是否变黑,准确的测试 我们可以在 终端用命令行 测试,
如第六步:

在 模拟器、真机: Generic ios Device 都需要 分别编译以后,在Products 目录下 有两个文件,分别对应模拟器、真机

上图 只有 i386 、x86_64 说明是 模拟器 操作,真机 操作与其 相似(真机 只有 armv7s)

使用命令:

在 .a 文件 目录下:
lipo -info .a文件 例如:lipo -info libStaticLibraryMake.a

第七步: 调用 .a 文件

image.png

如果 第七步 编译失败,可能是 路径问题,则执行这一步

第八步: 由于 Xcode9 的原因,需要在这个地方 导入 .a 文件,否则编译失败(路径问题),导入以后,在Build Settings —> Search Paths —> Library Search Paths 中,会自动生成 $(inherited) 、 $(PROJECT_DIR)/工程名,如下图:

image.png

上面的步骤 知识解决 在 模拟器 或者 真机上面的问题,如果需要在真机和模拟器都能够跑起来,那么,怎么做呢,做两个 .a 文件吗,当然不行,我们需要把:

在 模拟器的 模式下编译会出现 第五步的样式:Products —> Debug-iphonesimulator —> include + .a 文件)
在 真机的 模式下编译会出现 第五步的样式:Products —> Release-iphones —> include + .a 文件)
这两个路径下的 .a 文件合并起来
合并真机和模拟器.a文件,在终端输入以下命令行:注意空格

lipo -create 模拟器.a文件的路径 真机.a文件的路径 -output 合并后的保存路径

例:lipo -create /Users/jq/Library/Developer/Xcode/DerivedData/StaticLibraryMake-bpgdvzwilkgvkjdhbdmhezavfloc/Build/Products/Debug-iphonesimulator/libStaticLibraryMake.a /Users/jq/Library/Developer/Xcode/DerivedData/StaticLibraryMake-bpgdvzwilkgvkjdhbdmhezavfloc/Build/Products/Debug-iphoneos/libStaticLibraryMake.a -output /Users/jq/Desktop/majq/majqStaric.a

majqStaric.a 开发者自定义的名字

最终会在桌面得到一个合并后的 majqStaric.a 文件,再将暴露出来的.h头文件一起复制出来。
测试 生成的 .a 文件是否支持真机和模拟器

使用命令:

在 .a 文件 目录下:
lipo -info .a文件
例如:lipo -info /Users/jq/Desktop/majq/majqStaric.a ,
如果Architectures in the fat file: /Users/jq/Desktop/majq/majqStaric.a are:
i386 armv7 x86_64 arm64
(包含i386 x86_64 armv7s,说明支持真机和模拟器)

使用:只需将.a和暴露出来的.h头文件导入工程目录下就可供外界使用

总结:
  • 使用两个命令: lipo -info , lipo -create 模拟器环境下路径1 真机环境下路径2 -output 合并导出路径3
上一篇下一篇

猜你喜欢

热点阅读