有没有编译器标志来指示缺少armv7s架构?

7
随着iPhone 5和其他armv7s设备的出现,现有(闭源)第三方框架(如Flurry)存在兼容性问题,因为它们没有使用这种更新的架构。
一种选择是等待它们发布新版本,但我希望在我的Xcode项目中有一个编译器标志或者类似的东西,让链接器知道不要从该框架期望armv7s架构,而是使用armv7。是否存在这样的东西呢?

10
Stack Overflow不会因为第三方之间的保密协议而关闭或删除问题。版主不负责执行两个独立第三方之间的协议。无论它是否是保密协议,只要这是一个实际可回答的问题并符合Stack Overflow的质量标准,那么这个问题就会保持开放和未删除状态。 - casperOne
1
嘿,马特。只是想给你一个快速的更新,Flurry在9月14日星期五发布了4.0.3版本,支持armv7s。昨天,9月17日,又发布了一个后续版本4.0.4,以消除一些编译器警告。 - Anthony W
谢谢,我在发布几分钟后就收到了。 - coneybeare
2个回答

10

无法加载不包含目标架构的框架。

您可以在框架更新之前仅发布一个armv7应用程序。该应用程序仍将在iPhone 5上工作,只是不要使用其提供的最新性能优化。

或者,如果您可以在新架构上不使用该框架,则可以进行弱链接。但是,您需要在使用框架中的任何东西时检查代码是否已加载。


6

以前在GCC中有一个链接标志allow_sub_type_mismatches,它可以让你在链接的库中混合使用不同版本的ARM架构,但是在最近的Xcode版本中似乎已经取消了这个功能。

然而,实际上可以通过另一种方式绕过这个问题;复制框架,查看其内容,在其中打开实际的代码库文件并使用十六进制编辑器进行以下替换:

CEFAEDFE 0C000000 09000000

为了

CEFAEDFE 0C000000 0B000000

基本上你要做的是修改每个代码对象中的头部,将其标识为ARMv7s而不是ARMv7 - 指令集向后兼容(或者看起来是这样),因此即使使用这种hack,它也应该可以正常运行,尽管我必须承认我们只有在实际测试它在iPhone 5上的表现之后才能确定。

无论如何,一旦您修改了框架,只需将两个版本添加到项目中,并从每个体系结构链接到相应的版本。您还可以使用 lipo 创建一个新的单个框架,将修改后和原始库合并。


2
这正是我所做的,并在此处展示 - http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library/。 - mattjgalloway
很酷 - 这肯定会简化过程,使用自动脚本,同时消除了无意中更改与 Mach-O header 无关的 CEFAEDFE 0C000000 09000000 的可能性。 - Ertebolle
1
你说的“在LLVM中被拿走”是什么意思?这是一个链接器标志,为了伟大的先知Zarquon!与编译器无关,而且确实有效,尽管这可能是解决此问题的最糟糕的方式(提示:正确的方法是通过从架构构建设置中删除ARMv7s来选择退出)。 - Pierre Lebeaupin
抱歉,我应该说“Xcode的最新版本”(现已更正) - 我记得这恰好对应着将LLVM作为默认编译器,所以我在脑海中将它们归为一类。我们实际上曾经使用这个标志来支持一些旧的ARMv6库在ARMv7中运行,但是几个Xcode版本之前他们破坏了它。至少在我们的测试中,在4.5中似乎也不起作用 - 你确定它确实适用于你吗?选择退出ARMv7s是一个选项,但如果您的应用程序恰好有很多性能敏感的浮点代码(我们的应用程序就是这样),那么尝试支持它可能是值得的。 - Ertebolle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接