.a 文件静态库的制作

导读

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

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

二次封装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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容