iOS 7.1在更新到Xcode 5.1后出现错误。

5
我最近将Xcode更新到5.1版本。更新后,除了iOS 7.1之外的所有模拟器都可以正常运行,而在iOS 7.1上会出现mach-O链接错误。此外,在“构建设置”选项卡中只有一个64位架构选项。我认为这是所有问题和错误的原因。有人知道原因以及如何解决吗?
以下是我遇到的一些警告和错误:
警告:
Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead

错误:

Symbol(s) not found for architecture x86_64

谢谢。

可能是在Xcode 5.1中的Arm64架构的重复问题。 - nschum
3个回答

14

Xcode 5.1 更改了标准项目设置。其中之一是将 arm64 架构加入到项目中 - 但很多第三方项目尚未支持,因此建议再次从 architectures 设置中删除它(只留下armv7armv7s)。不过要保留在 valid architectures 设置中,以指定其可以运行的架构。

它还引入了某些额外警告的默认激活,例如转换为长整型的警告-同样的情况也适用于使用许多其他库(作为源代码)的情况下,您可能会收到很多警告,而这些警告您无法或者不想花费太多精力去解决。您可以禁用这些项目的警告,或选择不立即更新项目设置。


3
如果你在使用库时遇到问题,应将架构重置为armv7和armv7s,但不要重置有效架构,否则该应用程序将无法在新的iPhone上运行。 - Christian

13

进入构建设置 -> 架构

你可能已经设置为标准架构,对吧?

Xcode 5.1 版本以后,标准架构包含 arm64,而你还没有准备好支持它。

选择“其他..”,双击$(ARCHS_STANDARD)并将其更改为$(ARCHS_STANDARD_32_BIT)

注意:这只是一个临时解决方案。你可能正在使用某个没有64位切片的静态库。请查看是否有可用的64位版本,然后将架构切换回标准架构。


1
在客户演示前2分钟挽救了我的糊涂,但是无法部署到模拟器!感谢Andrew。现在要回来弄清楚为什么新的结构中出现了“具有不匹配结果、参数类型的多个方法名‘count’…”,但旧的没有。;-) - Mike S.
谢谢你的帮助,@Andrew。 - ashokdy

3

现在XCode已经包含了arm64架构。NSInteger现在与以前完全不同,因为它在NSObjCRuntime.h中被定义:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

为了解决这个问题,您应该改进您的代码库。首先,您必须非常一致。只将NSInteger分配给NSInteger而不是int。避免所有种类的:

int i = [aString integerValue](因为它返回一个NSInteger)

但是

NSInteger i = [aString integerValue](如果它是长类型,则不会有任何问题。)

此外,您可能遇到的另一个问题是当您想从值创建字符串时。

您可以做的是:

#define cL(v)    (long)(v)
#define cUL(v)   (unsigned long)(v)

NSLog(@"array.count: %ld", cUL(anArray.count));

在armv7(s)下,array.count返回一个无符号整型(unsigned int),而在arm64下则返回一个无符号长整型(unsigned long)。通过始终将其转换为无符号长整型(unsigned long),您将不会再面临任何警告,并且更重要的是,不会出现任何错误。

这种“逻辑”是由苹果公司自己在一些技术讲座视频中引入的,其中包括: https://developer.apple.com/tech-talks/videos/ (视频名称为"Architecting Modern iOS Games". 在10分钟左右播放)


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