针对 armv7 目标时的 XCode 链接错误

5

我已经花费了无数个小时来解决这个问题,使用谷歌搜索和其他 Stack Overflow 的问题都没有什么结果。

我有一个 iPhone/iPad 通用应用程序,当目标是 armv6 时似乎编译得很好。但是,当设备是 iPad 时,我会收到以下警告:

warning: building for SDK 'Device - iPhone OS 3.2' requires an armv7 architecture.

奇怪的是,尽管有这个警告,该应用程序在 iPad 上仍然表现良好。但是,在这种情况下,我还是想做到最“正确”的方法。当我将目标架构切换为 armv7 时,我遇到了链接错误:

  "___restore_vfp_d8_d15_regs", referenced from:
     *redacted*
"___save_vfp_d8_d15_regs", referenced from: *redacted* ld: symbol(s) not found
collect2: ld returned 1 exit status

错误中的“redacted”部分是我尝试链接的静态库的引用。

这里是我从许多建议中尝试过的东西。每一个建议都被建议了不止一次,而没有任何解释,这让我相信没有人真正理解这个问题:

“永远不要使用 XCode 窗口左上角的下拉菜单选择目标。相反,将其设置为 Base SDK,然后在目标配置中将 Base SDK 设置为 iPhone OS 3.0。将目标设备设置为您首选的目标(iPad,在我的情况下为 iPhone OS 3.2)。”

这会导致错误“Library not found for -lcrt1.3.1.o”。

“确保 GCC 没有链接到错误版本的标准库。 (您必须确保 LIBRARY_SEARCH_PATH 中没有错误的路径。)”

我的 LIBRARY_SEARCH_PATH 已经为空,所以这似乎与此问题无关。

“尝试使用 GCC 4.0 而不是 GCC 4.2。”

我在一个 UIKit 的头文件中得到了一个语法错误。 错误是“Syntax error before 'AT_NAME' token.”。该行是“UIKIT_EXTERN @interface UILocalizedIndexedCollation : NSObject.”

另一个项目使用相同的目标设置编译得非常好,这让我真的开始怀疑我的理智。我是不是遇到了一个损坏的 XCode 项目?

如果有人知道实际发生了什么,并且有参考或愿意解释一下,我将非常感激。

干杯!


1
这个库结合了哪些架构?您可以使用 file 命令找到,例如 "file libfoo.a"。 - Crufty
4个回答

4

ARMv7和ARMv6之间的VFP有各种不同。在ARMv7中,使用NEON通常更可取。问题是您的静态库依赖于ARMv6中的VFP - 您需要在ARMv7上编译库或将整个应用程序保持在ARMv6上。

回到GCC 4.0是愚蠢的 - 当时ARMv7支持基本上不存在,除非苹果公司进行了后移植。


感谢您提供的信息,我也同意GCC 4.0的问题。 VFP差异可以解释发生的情况。奇怪的是,与库一起提供的示例应用程序编译得非常好(甚至具有相同的设置)。可能是xcode项目中某种依赖关系出了问题,导致链接错误。 - Tom
哇 - 非常感谢你。我在这上面浪费了几个小时,而你却帮我省去了更多的时间。 - Mups

1

我遇到了相同的错误,只不过是针对armv6。我通过在静态库和主项目的项目设置中取消选中“编译Thumb”来解决这些错误。



0

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