封装代码为动/静态库,编译会产生两个库文件,一个真机运行的,一个模拟器运行的。两者互不兼容,若真机运行使用模拟器的库或者模拟器运行使用的真机的库,都会报类似的错:_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内同名的那个文件。
先把两个库放在同一个文件夹下,放之前要先改成不同的名字。打开终端,cd到该文件夹目录下(我放在了桌面上,所以cd到Desktop文件夹下)。同样通过下面的命令合并
lipo[空格]-create[空格] [真机静态库文件名][空格] [模拟器静态库文件名][空格]-output[空格] [合并后的文件名]
桌面上就会多出一个叫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 静态库/动态库架构分离和删除
参考资料: