我正在尝试从.dylib
文件手动构建动态 iOS 框架。二进制文件是使用 cmake 和 xcodebuild 创建的,并生成两个文件.dylib
,一个包含,armv7
另一个包含架构。库被编译,一切都成功了。armv7s
arm64
x86_64
i386
-fembed-bitcode parameter
.dylib 文件然后与下一个命令合并:
lipo -create lib_arm.dylib lib_i386.dylib -output MyFramework
然后通过将 lipo 命令的输出复制到以下位置来创建框架:
MyFramework.framework/MyFramework
标头和Info.plist
手动生成并添加到框架中。
然后通过 CocoaPods 将该框架作为vendored_framework
. 众所周知,CocoaPods 将从任何胖二进制文件中剥离 i386/x86_64 库,用于 App Store 分发。
应用程序构建、运行、归档并成功上传到 App Store。
但是,由于启用了 Bitcode,App Store 将处理 .ipa,并使用 bitcode 重新编译,这就是它失败的地方,我收到了来自 App Store 的电子邮件,它处理失败。按照说明,我可以使用 Exporting for Ad-Hoc Distribution 和重新编译 bitcode 在本地重现错误。我收到的错误是这样的:
ipatool failed with an exception: #<Errno::ENOENT: No such file or directory - /lib_arm.dylib>\n
所以显然在重新编译期间,仍然有一个引用或某个地方lib_arm.dylib
,即使它被合并到一个胖 dylib Mach-O 通用二进制文件中(file
下面合并的 dylib 二进制文件的输出):
>> file MyFramework
MyFramework: Mach-O universal binary with 5 architectures: [x86_64: Mach-O 64-bit dynamically linked shared library x86_64] [i386] [arm_v7] [arm_v7s] [arm64]
MyFramework (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
MyFramework (for architecture i386): Mach-O dynamically linked shared library i386
MyFramework (for architecture armv7): Mach-O dynamically linked shared library arm_v7
MyFramework (for architecture armv7s): Mach-O dynamically linked shared library arm_v7s
MyFramework (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
这几乎是我的编译器/链接器知识超出范围的地方。所以我的问题是:
我哪里错了?也许位码应该以不同的方式编译?或者也许我lipo
以错误的方式使用?
谢谢!