1

我正在尝试从.dylib文件手动构建动态 iOS 框架。二进制文件是使用 cmake 和 xcodebuild 创建的,并生成两个文件.dylib,一个包含,armv7另一个包含架构。库被编译,一切都成功了。armv7sarm64x86_64i386-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以错误的方式使用?

谢谢!

4

1 回答 1

3

在使用命令检查创建的胖二进制文件的加载命令后otool -l,我意识到使用lipo本身不会改变LC_ID_DYLIB二进制文件中的内容,它将重用第一个提供的库中的一个。使用install_name_tool更改 id 来更正其中一个框架(包括@rpathiOS 动态框架)修复了错误。

install_name_tool -id @rpath/MyFramework.framework/MyFramework MyFramework

确保包含二进制文件的整个路径以及.framework目录。

于 2016-12-07T18:10:13.560 回答