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