我很好奇如果我在Mac应用程序中链接到iOS模拟器框架会发生什么。所以我将UIKit复制到它自己的文件夹中(因此框架搜索路径不会包含所有的iOS模拟器框架,就像CoreFoundation在Mac和iOS上都有,但有不同的标题),并将其拖入Xcode中的链接部分。 Xcode给我的错误是:
为MacOSX构建,但是针对为iOS模拟器构建的dylib进行链接 file' /Users/jonathan/Desktop/macuikit/UIKit.framework/UIKit'对于 架构x86_64
这两种体系结构都是x86_64,所以它怎么能告诉框架是专门为iOS模拟器,我删除了所有对Info.plist等内容的引用,甚至尝试删除除了UIKit二进制文件之外的所有内容,但同样的错误出现了。它自己的二进制文件中有什么东西可以告诉链接器它可以运行哪个平台,而不仅仅是架构?我查看了Mach-O标头但是只有CPU类型和子类型的字段,并且没有按预期的模拟器值。
答案 0 :(得分:7)
经过一些挖掘后,事实证明可以在其上运行库的平台确实在二进制文件中指定。实际上,您可以在您喜欢的Hex编辑器中编辑二进制文件,并使链接器完全跳过此检查。
此信息未在Mach-O标头中指定(正如您已经意识到的那样)。相反,它被指定为加载命令类型。您可以通过挖掘LLVM sources来查看可用的类型。具体来说,枚举值LC_VERSION_MIN_MACOSX
和LC_VERSION_MIN_IPHONEOS
看起来很有趣。
现在,在二进制文件中找到此偏移量。在MachOView
(或任何其他编辑/查看器或您选择的)中打开相同的内容并记下偏移量:
注意到偏移后,在十六进制编辑器中跳转到相同的位置并更新它。我将LC_VERSION_MIN_IPHONEOS
(25)修改为LC_VERSION_MIN_MACOSX
(24)
保存更新并再次尝试链接。错误应该消失。当然,当您尝试实际运行示例时,您将遇到其他问题。享受LLDB
的乐趣,然后:)