我正在从 iOS 的源代码构建一个动态框架,并启用了位码(使用cmake
和xcodebuild
)。我使用lipo
andinstall_name_tool
制作一个胖二进制文件和 update LC_ID_DYLIB
,以便正确加载二进制文件。当我归档应用程序时,框架已正确签名并与应用程序打包在一起。这是的输出file
:
MyFramework: Mach-O universal binary with 3 architectures: [arm_v7: Mach-O dynamically linked shared library arm_v7] [arm_v7s] [arm64]
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
查看otool -l
输出LC_ID_DYLIB
显示:
Load command 4
cmd LC_ID_DYLIB
cmdsize 64
name @rpath/MyFramework.framework/MyFramework (offset 24)
time stamp 1 Thu Jan 1 01:00:01 1970
current version 1.0.0
compatibility version 1.0.0
这一切似乎都是正确的。如果我将此档案上传到 App Store,它会被正确上传和处理。从 App Store 运行它后,由于加载了动态框架,它在启动后立即崩溃。众所周知,应用程序是从 App Store 上的 Bitcode 重新编译的,所以我通过导出为 Ad-Hoc 并按照Technical Note TN2432中的建议启用“Rebuild from Bitcode”选项来模拟这一点。检查 .ipa(启动后也崩溃)和有问题的框架,这是以下输出otool -l
:
Load command 3
cmd LC_ID_DYLIB
cmdsize 128
name /Users/legoless/Downloads/ios/build/build-iphoneos/lib/Release/MyFramework_ios.framework/MyFramework_ios (offset 24)
time stamp 1 Thu Jan 1 01:00:01 1970
current version 1.0.0
compatibility version 1.0.0
所以很明显LC_ID_DYLIB
这个库的 是不正确的,这是框架最初构建位置的绝对路径,然后再制作一个胖二进制文件。这在Rebuild from Bitcode步骤中被替换,但我不知道为什么甚至不知道此路径存储在现有Mach-O文件中的位置。我使用otool
和objdump
工具试图在 Mach-O 二进制文件中找到引用,但没有运气。
实际上,另一个框架依赖于这个框架,这是目标框架的加载命令:
Load command 14
cmd LC_LOAD_DYLIB
cmdsize 64
name @rpath/MyFramework.framework/MyFramework (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1.0.0
compatibility version 1.0.0
再次使用 Bitcode 重建后,这里的引用也发生了变化:
Load command 13
cmd LC_LOAD_DYLIB
cmdsize 128
name /Users/legoless/Downloads/ios/build/build-iphoneos/lib/Release/MyFramework_ios.framework/MyFramework_ios (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1.0.0
compatibility version 1.0.0
这只发生在有问题的框架上,但不会发生在其他框架上,@rpath
它保持原样。
我的问题仍然存在:
这个绝对路径引用存储在哪里?以及如何删除它,因此 Rebuild from Bitcode 不再影响它了?
谢谢!