5

我最近将我的 Xcode 更新到了 5.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

谢谢。

4

3 回答 3

14

Xcode 5.1 更改了标准项目设置。除其他外,它现在包括arm64项目的架构 - 但许多第 3 方项目还不支持它,所以我建议再次将其从架构设置中删除(留下armv7and armv7s)。不过,请将其保留在有效的架构设置中 - 这指定了它可以在哪些架构上运行。

它还引入了一些额外警告的默认激活,例如将类型转换为长警告 - 这里同样重要,当您使用相当多的其他库(作为源代码)时,您可能会收到很多您不能(或不想要)的警告to) 做很多事情。您可以再次禁用这些项目的警告,或者选择不立即更新您的项目设置。

于 2014-03-13T08:09:02.420 回答
13

必须建立设置 - >架构

您可能已经设置了标准架构,对吧?

从 Xcode 5.1 开始,标准架构包括 arm64,您还没有准备好支持它。

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

注意:这是一个临时修复。您可能正在使用一些没有 64 位切片的静态库。查看是否有可用的,然后将体系结构切换回标准体系结构。

于 2014-03-19T06:42:45.903 回答
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));

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

这种“逻辑”是苹果自己在一些技术讲座视频中介绍的: https ://developer.apple.com/tech-talks/videos/ (视频“架构现代 iOS 游戏”。播放视频大约 10 秒)

于 2014-03-14T14:12:14.430 回答