SDK

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

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

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

  • 静态库:

.a 和 .framework 两种形式。

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

  • 优劣:

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

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

#####静态库:

  • 第一步:创建一个 .a 静态库项目

image.png

  • 这一步是需要 新建一个工程,新建以后 下一步(Next) 需要给工程起个名字,系统会自动生成一个以工程名命名的 .h和 .m 文件。如第二步的StaticLibraryMake.h 和 StaticLibraryMake.m 文件。

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

注意: 要适配最低版本号

  • 第二步:
    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 查看是没有的)

  • 第三步:
    image.png

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

我们一般都选择NO

  • 编译
    配置好以后,我们 commoand + B 编译(需要选择编译环境: 真机: Generic ios Device、模拟器),第五步 的 Products中 .a 文件 变黑,此时的文件是存在的(show in finder 可以查看,

    在 模拟器的 模式下编译会出现 第五步的样式:Products —> Debug-iphonesimulator —> include + .a 文件)
    在 真机: Generic ios Device 的 模式下编译会出现 第五步的样式:Products —> Release-iphones —> include + .a 文件)

    在开发中,我们需要 上面两步都需要操作(在开发中需要Debug、Release)

    这个地方的修改,对应第六步 终端的输出结果: i386 、x86_64 。

  • 第四步:
    image.png

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

  • 第五步:
    image.png

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

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

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

  • 第六步:
    image.png

  • 这是 验证,下面 我也是查看别人的博客(正确与否 就不清楚了,个人感觉正确):
    注:关于静态库对CPU架构的支持,首先了解iOS设备CPU架构方面的知识,ARM是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,几乎所有手机都是使用它的。
    模拟器:iphone4s~5 : i386 iphone5s~6plus : x86_64
    真机:iphone3gs~4s : armv7  iphone5~5c : armv7s (静态库只要支持了armv7,就可以跑在armv7s的架构上) iphone5s~6plus : arm64
    armv6, armv7, armv7s是ARM CPU的不同指令集,原则是向下兼容的。例如iPhone4S CPU支持armv7, 但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。

    这里再补充一下查看静态库.a对处理器架构的支持,先cd到.a文件的路径下,命令行输入:lipo -info xxxxx.a

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

使用命令:

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

  • 第七步:
    image.png

第七步: 调用 .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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值