有没有办法在 Xcode 4 中编译 ARM 而不是 Thumb?

问题描述 投票:0回答:3

如果需要进行很多浮点运算,Apple 建议针对 ARM 进行编译,而不是针对拇指进行编译。我的整个应用程序几乎是一个大型浮点运算。

这是他们在 iOS 应用程序开发工作流程指南中所说的:

iOS 设备支持两种指令集:ARM 和 Thumb。 Xcode 使用 默认情况下使用 Thumb 指令,因为使用 Thumb 通常会减少 相对于 ARM,代码大小减少约 35%。应用程序具有 如果使用 ARM,大量浮点代码可能会表现得更好 指示而不是拇指。您可以关闭您的拇指 应用程序,因此它可以通过设置 Compile for Thumb 来针对 ARM 进行编译 构建设置为否。

但是,我在构建设置中找不到任何“Compile for Thumb”设置。他们重命名了吗?或者 Xcode 4 现在不可用?

ios xcode arm xcode4
3个回答
49
投票

首先,为了提高浮点性能而不要编译 Thumb 指令集的建议仅适用于旧的 ARMv6 设备。

ARMv7 硬件(iPhone 3G S 及更新版本,包括所有 iPad)使用更高效的 Thumb-2 指令集,不会遭受同样类型的浮点减速。 对于 ARMv7 构建,几乎在所有情况下都建议您为 Thumb 构建。 我在here中提供了有关此问题的更多详细信息。

这可能就是为什么此编译器设置不再作为常见选项公开的原因,因为 ARMv7 设备是绝大多数 iOS 设备。

如果您只想对 ARMv6 构建执行此操作,您可以转到构建设置并将鼠标悬停在“其他 C 标志”选项上。 单击此选项右侧出现的小加号按钮,然后添加 ARMv6 架构的条件。 再次执行此操作,为 ARMv7 架构创建一个。 在 ARMv6 架构下,添加额外的编译器标志

-mno-thumb
(正如 Kevin 建议的那样)。

您最终应该得到如下所示的结果:

Build settings for ARMv6

我在我的一个应用程序中执行此操作,因为我确实看到旧版 ARMv6 设备的性能得到了提升。 然而,我的另一个应用程序在不为 ARMv6 上的 Thumb 构建时速度较慢,因此您需要首先对其进行分析。

此外,目前 Xcode 4.2 附带的 LLVM 编译器 3.0 中存在一个错误(据我所知,该错误已在 4.2.1 中修复),其中浮点计算在 ARMv6 的 Thumb 下编译错误。 如果您使用的是特定版本的 Xcode,则需要执行此操作才能在旧设备上正常运行。


8
投票
我不知道 Xcode 4 中是否应该存在“Compile for Thumb”,但您始终可以将

-mno-thumb

 添加到 
Other C Flags 构建设置中。


3
投票
关于您原来的问题:我注意到,Xcode 4.2.1 中的“Compile for Thumb”(在“Project Build Settings”的“Code Generation”部分下)仅在您使用 LLVM GCC 4.2 时才可用(如果在“C/C++/Objective-C 编译器”)!

如果使用 Apple LLVM 3.0 进行编译,那么您将发现没有“Compile for Thumb”选项。但是 - 正如 Brad 已经说过的 - 您仍然可以更改“其他 C 标志”选项来关闭 Thumb 模式。

另一个有趣的点:我在我的项目中使用 sqlite 合并源(我需要 fts - 全文搜索),并且自从使用 LLVM 3.0 编译以来,每当访问数据库时,我都会在armv6设备上遇到奇怪且相当随机的崩溃:事实证明是因为为armv6设备编译时未禁用Thumb模式。

© www.soinside.com 2019 - 2024. All rights reserved.