【问题标题】:Linking to iOS simulator binaries on OSX在 OSX 上链接到 iOS 模拟器二进制文件
【发布时间】:2015-03-09 16:23:10
【问题描述】:

我很好奇如果我在 Mac 应用程序中链接到 iOS 模拟器框架会发生什么。所以我将 UIKit 复制到它自己的文件夹中(因此框架搜索路径不会包括所有 iOS 模拟器框架,就像 CoreFoundation 在 Mac 和 iOS 上但有不同的标题),并将其拖到 Xcode 中的链接部分。 Xcode 给我的错误是:

为 MacOSX 构建,但链接到为 iOS 模拟器构建的 dylib 文件'/Users/jonathan/Desktop/macuikit/UIKit.framework/UIKit' 架构 x86_64

这两种架构都是 x86_64,所以它怎么知道框架是专门为 iOS 模拟器设计的,我删除了 Info.plist 之类的所有对 iOS 的引用,甚至尝试删除除了 UIKit 二进制文件之外的所有内容,但出现了同样的错误.二进制文件中是否有一些东西告诉链接器它可以在哪个平台上运行,而不仅仅是架构?我查看了 Mach-O 标头,但只有 CPU 类型和子类型字段,并且都没有预期的模拟器值。

【问题讨论】:

标签: ios objective-c xcode macos


【解决方案1】:

经过一番挖掘,发现确实在二进制文件中指定了该库可以运行的平台。事实上,您可以在自己喜欢的 Hex 编辑器中编辑二进制文件,并使链接器完全跳过此检查。

此信息未在 Mach-O 标头中指定(您已经意识到)。相反,它被指定为加载命令类型。您可以通过挖掘LLVM sources 查看可用的类型。具体来说,枚举值 LC_VERSION_MIN_MACOSXLC_VERSION_MIN_IPHONEOS 看起来很有趣。

现在,在我们的二进制文件中找到它的偏移量。在MachOView(或任何其他编辑器/查看器或您的选择)中打开相同的内容并记下偏移量:

一旦注意到偏移量,在十六进制编辑器中跳转到相同的位置并更新它。我将LC_VERSION_MIN_IPHONEOS(25)修改为LC_VERSION_MIN_MACOSX(24)

保存更新并再次尝试链接。错误应该消失。当然,当您尝试实际运行您的示例时,您会遇到其他问题。和LLDB一起玩吧:)

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2014-05-09
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多