我最近将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
感谢。
答案 0 :(得分:14)
Xcode 5.1更改了标准项目设置。其中包括项目的arm64
架构 - 但很多第三方项目还没有支持,所以我建议再次从架构设置中删除它(留下armv7
和armv7s
)。尽管如此,请将其保留在有效体系结构设置中 - 这指定了它可以运行的体系结构。
它还引入了一些额外警告的默认激活,例如长期警告的类型转换 - 这里的计数相同,当你使用其他一些库(作为源代码)时,你可能会收到很多警告(你不能)或者不想做很多事情。您可以再次为这些项目禁用警告,或选择不立即更新项目设置。
答案 1 :(得分:13)
进行构建设置 - >架构
您可能已设置标准架构,对吧?
从Xcode 5.1开始,标准架构包含arm64,您尚未准备好支持它。
选择其他.. 双击$(ARCHS_STANDARD)并将其更改为$(ARCHS_STANDARD_32_BIT)
注意:这是一个临时修复。您可能正在使用一些没有64位切片的静态库。查看是否有可用的,然后将架构切换回标准架构。
答案 2 :(得分: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。通过始终投入无符号长度,您将不会再遇到任何警告,更重要的是,不会有任何错误。
这种“逻辑”已经由Apple自己介绍了一些技术会谈视频: https://developer.apple.com/tech-talks/videos/(视频“构建现代iOS游戏”。播放视频大约10分钟)