在iOS开发过程中,有时候我们可以自己写个功能的API,但是不希望别人知道具体实现,这是我们就可以打包静态库,只提供头文件供别人使用.
开发环境:Xcode 12
1.我们新建一个工程:

Zw+MD5Lib就是你打包静态库的名字.

最后您的工程目录如下:

现在我的工程里面只有Zw_MD5Lib.h和.m文件,也可以是多个,看你需求. 我们在Zw_MD5Lib.h文件中值暴露一个方法给字符串进行MD5加密,然后在.m中打印出来.由于别人看不见.m具体实现,打印在控制台看就行.

上面完成之后,就可以进行打包了,打包分为模拟器与真机,同时也分Debug与Release.

首先我们先真机 -- Release打包:

运行成功之后,Products文件下的.a不红了,说明成功了,然后我们点击它 -- 右键 -- Show in Finder 如下图:

可以修改上图的文件路径,我们删除Release-iphoneos文件下所有文件. Name下面的.h文件就是暴露出来的,可以是多个.

把Subpath路径include 后面的路径删除,一个是模拟器的Debug模式(选中模拟器,Run一下),然后在运行,截图如下:

接下来我们需要对模拟器的Debug和真机Release模式的Lib.a进行合并. 将2个libZw_MD5Lib.a放到桌面上,由于名字一样,我们需要修改一下,如下图:

命名分别为:libZw_MD5LibD.a 和 libZw_MD5LibR.a,打开终端到桌面,输入命令:
lipo -create libZw_MD5LibD.a libZw_MD5LibR.a -output libZw_MD5Lib.a
libZw_MD5Lib.a这个名字就是合并后最终的.a文件.
执行上步之后会有error(原因是我用的是x-code12 生成的).
error:have the same architectures (arm64) and can't be in the same fat output file
问题原因:
XCode12之前:
编译模拟器静态库支持i386 x86_64两架构
编译真机静态库支持armv7 arm64两架构
使用lipo -create -output命令可以将两个库合并成一个支持模拟器和真机i386 x86_64 armv7 arm64四种架构的胖子库。
XCode12编译的模拟器静态库也支持了arm64,导致出现真机库和模拟器库不能合并的问题。
解决方案:
Build Settings -> Excluded Architectures 添加: Any iOS Simulation SDK 后面添加arm64.
或者使用命令行移除模拟库的arm64
lipo libZw_MD5LibD.a -remove arm64 -output xxxxxx.a
解决之后,在执行上面的合并操作,最终桌面上会生成一个新的Lib.a 文件. 然后我们新建一个工程测试,将.a和.h拖入新建的工程,导入头文件,调用方法截图如下:

运行工程就会发现控制台打印输出了
MD5 string = FC63EF1764109110F84D58B4D5479CEA
网友评论