美文网首页
iOS 动态库和静态库(.a和.framework)真机库和模拟

iOS 动态库和静态库(.a和.framework)真机库和模拟

作者: Accepted_ | 来源:发表于2017-12-26 10:31 被阅读0次

        封装代码为动/静态库,编译会产生两个库文件,一个真机运行的,一个模拟器运行的。两者互不兼容,若真机运行使用模拟器的库或者模拟器运行使用的真机的库,都会报类似的错:_OBJC_CLASS_$_某文件名", referenced from:,但如果每次在真机和模拟器运行之间切换,总要先替换库,就会很麻烦。所以下面将两种库的合并方法总结一下。

.a合并

        将真机库和模拟器库放在同一个文件夹下,在这之前需要先将两个库重命名,否则会覆盖。

        打开终端,cd到该文件夹目录下。通过下面的命令合并

        lipo[空格]-create[空格] [真机静态库文件名][空格] [模拟器静态库文件名][空格]-output[空格] [合并后的文件名]

终端命令示意图

        合并后使用 lipo -info 命令检查库文件是否合并成功

检查命令:

检查命令示意图

Architectures in the fat file: /Users/***/Desktop/XXX/libXXXX.a are: armv7 armv7s i386 x86_64

(其中armv7、armv7s为真机架构, i386、x86_64为模拟器架构)。

        回车后,终端出现这个则表示合并成功。

.framework合并

        .framework合并方法和.a合并方法相同,只不过.framework合并的是.framework内同名的那个文件。

需要合成的是.framework内同名的那个文件

        先把两个库放在同一个文件夹下,放之前要先改成不同的名字。打开终端,cd到该文件夹目录下(我放在了桌面上,所以cd到Desktop文件夹下)。同样通过下面的命令合并

lipo[空格]-create[空格] [真机静态库文件名][空格] [模拟器静态库文件名][空格]-output[空格] [合并后的文件名]

合并命令示意图

        桌面上就会多出一个叫final的库

生成的合并后的final库

        我们使用lipo -info 检查一下是否同时支持模拟器和真机,输入lipo -info 把库文件直接拖入终端,回车

检查是否合成成功的命令

        该库文件支持armv7 i386 x86_64 arm64,合成成功。

        之后我们将合并得到的final文件改回原来的名字(例如我这里应该改成IE),替换任一.framework下的IE文件, 该.framework就是我们最终需要的.framework文件了。

*注意:XCode12编译的模拟器库新增支持架构arm64,由于真机库也支持arm64,真机和模拟器库无法再合并成一个。

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /Users/XY/Desktop/Release-iphoneos/libImageEditor.a and /Users/XY/Desktop/Release-iphonesimulator/libImageEditor.a have the same architectures (arm64) and can't be in the same fat output file

*架构的分离和移除移步:iOS 静态库/动态库架构分离和删除

参考资料:

彻底解决_OBJC_CLASS_$_某文件名", referenced from:问题

合并第三方真机和模拟器的.framework或(静态库.a)文件的方法

相关文章

网友评论

      本文标题:iOS 动态库和静态库(.a和.framework)真机库和模拟

      本文链接:https://www.haomeiwen.com/subject/umtrgxtx.html