随着 iPhone 5 和其他 armv7s 设备的出现,与现有(闭源)第 3 方框架(例如 Flurry)存在兼容性问题,这些框架是在没有这种更新架构的情况下构建的。
一种选择是等到他们发布新版本,但我希望可能有一个编译器标志或我可以在我的 Xcode 项目中使用的东西,让链接器知道不要从这个框架中期待 armv7s 架构,并使用 armv7反而。这样的事情存在吗?
随着 iPhone 5 和其他 armv7s 设备的出现,与现有(闭源)第 3 方框架(例如 Flurry)存在兼容性问题,这些框架是在没有这种更新架构的情况下构建的。
一种选择是等到他们发布新版本,但我希望可能有一个编译器标志或我可以在我的 Xcode 项目中使用的东西,让链接器知道不要从这个框架中期待 armv7s 架构,并使用 armv7反而。这样的事情存在吗?
无法加载不包含目标架构的框架。
你可以做的只是在框架更新之前发布一个 armv7 应用程序。该应用程序仍可在 iPhone 5 上运行,只是不要使用它提供的最新性能优化。
或者,如果您可以在没有新架构上的框架的情况下生活,您可以弱链接它。但是,您需要检查您的代码是否在您使用框架中的东西的任何地方加载。
GCC 中曾经有一个链接器标志allow_sub_type_mismatches
,它可以让您在链接库中混合和匹配 ARM 架构版本,但它们似乎在最近的 Xcode 版本中取消了这一点。
然而,这实际上可以以不同的方式被破解。制作框架的副本,查看其内容,在十六进制编辑器中打开其中的实际代码库文件,然后执行以下操作全部替换:
CEFAEDFE 0C000000 09000000
到
CEFAEDFE 0C000000 0B000000
您基本上所做的是更改每个代码对象内部的标头以将其标识为 ARMv7 而不是 ARMv7 代码 - 指令集是向后兼容的(或者似乎是,无论如何),因此即使使用这个 hack 它也应该运行良好,尽管我不得不承认,在我们真正有机会在 iPhone 5 上测试它之前,我们无法确定这一点。
无论如何,一旦您修改了框架,只需将这两个版本都添加到您的项目中,并链接到每个架构中适当的版本。您还可以通过lipo
将修改后的库和原始库合并来创建一个新的单一框架。