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

Posted

技术标签:

【中文标题】有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 编译?【英文标题】:Is there a way to compile for ARM rather than Thumb in Xcode 4? 【发布时间】:2012-01-13 12:08:18 【问题描述】:

如果有许多浮点运算正在进行,Apple 建议为 ARM 而不是 thumb 进行编译。我的整个应用程序几乎是一个大的浮点运算。

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

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

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

【问题讨论】:

【参考方案1】:

关于您最初的问题:我注意到 Xcode 4.2.1 中的“Compile for Thumb”(在“项目构建设置”的“代码生成”部分下)仅在您使用 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 模式。

【讨论】:

我也期望 sqlite 在 armv6 上崩溃,但只有当我使用 llvm gcc 构建库时。切换到 llvm 后 - 它工作正常。【参考方案2】:

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

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

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

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

您最终应该得到如下所示的内容:

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

此外,currently a bug in the LLVM Compiler 3.0 that ships with Xcode 4.2(据我所知,它已在 4.2.1 中修复)在 Thumb for ARMv6 下浮点计算编译错误。如果您使用的是特定版本的 Xcode,则需要这样做才能在旧设备上正常运行。

【讨论】:

Xcode 4.2.1 似乎只适用于 Lion。如果 Photoshop 和一大堆其他应用程序对 Lion 没有大问题,会使用它。该死。 Xcode 4.2 中是否有解决该错误的方法?如果不能选择 Lion,您能指出该怎么做吗? @openfrog - 在这种情况下,当针对 ARMv6 时,不要为 Thumb 构建,就像我在上面展示的那样。 ARMv7 没有这样的问题,可以使用 Thumb 指令构建就好了。老实说,如果禁用 ARMv6 的 Thumb 确实会导致速度变慢,它不会影响您的许多用户,因为据估计 ARMv6 设备占当前活跃 iOS 设备的 3-5%:marco.org/2011/11/30/…【参考方案3】:

我不知道 Xcode 4 中是否应该存在“Compile for Thumb”,但您始终可以将 -mno-thumb 添加到 Other C Flags 构建设置中。

【讨论】:

以上是关于有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 编译?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Xcode 7.1 或最新版本中为新项目设置默认模拟器吗?

我可以在Xcode 7.1或最新版本中为新项目设置默认模拟器吗?

在xcode中使用像素而不是点?

有没有办法在 Xcode4 中“测试”当前文件?

如何将 Xcode arm64 编译器输出查看为汇编语言?

在 OSX 上更新 GCC