Ios 在Xcode 4中有没有一种编译ARM而不是Thumb的方法?

Ios 在Xcode 4中有没有一种编译ARM而不是Thumb的方法?,ios,xcode,compiler-construction,xcode4,arm,Ios,Xcode,Compiler Construction,Xcode4,Arm,如果有很多浮点运算正在进行,苹果建议编译ARM而不是thumb。我的整个应用程序几乎就是一个大的浮点运算 以下是他们在iOS应用程序开发工作流指南中所说的: iOS设备支持两种指令集,ARM和Thumb。Xcode使用 默认情况下使用Thumb指令,因为使用Thumb通常会减少 相对于ARM,代码大小减少了大约35%。具有 如果使用ARM,广泛的浮点代码可能会执行得更好 指示而不是拇指。你可以为你的手指关掉拇指 应用程序,因此它为ARM编译,方法是设置Compile for Thumb 构建设置

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

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

iOS设备支持两种指令集,ARM和Thumb。Xcode使用 默认情况下使用Thumb指令,因为使用Thumb通常会减少 相对于ARM,代码大小减少了大约35%。具有 如果使用ARM,广泛的浮点代码可能会执行得更好 指示而不是拇指。你可以为你的手指关掉拇指 应用程序,因此它为ARM编译,方法是设置Compile for Thumb 构建设置为No


但是,我在构建设置中找不到任何“为拇指编译”设置。他们给它改名了吗?或者这在Xcode 4中现在不可用?

我不知道Xcode 4中是否应该存在“为Thumb编译”,但您可以始终将
-mno Thumb
添加到其他C标志的构建设置中。

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

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

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

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

您应该得到如下结果:

我在我的一个应用程序中这样做,因为我确实看到了使用它的旧的ARMv6设备的性能提升。但是,我的另一个应用程序在不为ARMv6上的Thumb构建时速度较慢,所以您需要首先分析一下这个应用程序


此外,在ARMv6的Thumb下,浮点计算的编译错误(据我所知,这在4.2.1中已经修复)。如果您使用的是特定版本的Xcode,则需要这样做才能在旧设备上正常运行。

关于您最初的问题:我注意到,只有在使用LLVM GCC 4.2(如果设置为“C/C++/Objective-C编译器”

如果使用Apple LLVM 3.0进行编译,那么您将找不到“为Thumb编译”选项。但是,正如Brad所说,您仍然可以更改“其他C标志”选项以关闭Thumb模式


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

Xcode 4.2.1似乎只适用于Lion。如果Photoshop和其他一大堆应用程序不存在重大问题,我会使用它Lion。该死。Xcode 4.2中有没有解决这个错误的方法?你能指出如果Lion不是一个选项怎么办吗?@openfrog-在这种情况下,当目标是ARMv6时,不要为Thumb构建,就像我上面展示的那样。ARMv7没有这样的问题,可以使用Thumb指令很好地构建。老实说,为ARMv6禁用Thumb不会影响您的许多用户,如果它确实导致了速度减慢,正如估计的那样,ARMv6设备占当前活动iOS设备的3-5%:我也预计在ARMv6上sqlite会崩溃,但只有在我使用llvm gcc构建库时才会崩溃。切换到llvm后,它才能正常工作。