Xcode 6.1中文件缺少所需的架构X86_64

50
在Xcode 6.1中,我在iPhone 6和iPhone 5s(iOS 7.1)上遇到错误,错误信息如下:
    Undefined symbols for architecture x86_64:
      "_OBJC_CLASS_$_ClientAuthenticator", referenced from:
      objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
linker command failed with exit code 1

这是我从架构设置的角度所拥有的。

  Architectures : Standard Architectures(armv7, arm64) - $(ARCHES_STANDARD)
  Base SDK : Latest iOS(8.1) 
  Valid Architectures: arm64, armv7, armv7s

  IOS Deployment Target: iOS 6.0

最近我将操作系统更新到了Yosemite,并将Xcode从6.0升级到了6.1。我在Stack Overflow上搜索了这个问题,参考了Xcode 5.1的所有给定解决方案,但是没有一种方法能够解决我的问题。

更新 - 我按照答案中提供的更改尝试了一下,但我仍然会收到一个错误,提示“缺少必需的架构X86_64”。经过进一步调查,我发现我的库中的文件ClientAuthenticator.o未能为X86_64架构构建,可能就是问题所在?我正在寻找如何将其构建为x86_64。

我的新问题是,arm64和x86_64之间有什么区别?似乎主要是架构制造商之间的差异,但基本的64位架构保持不变。


1
所以,现在你问了正确的问题。我会发布一个答案。 - raurora
7
运行64位模拟器需要x86_64架构。运行64位设备(iPhone 5s,iPhone 6,iPhone 6 Plus,iPad Air,iPad mini with Retina display)需要arm64架构。 - boro
简单解决方案 前往目标 -> 链接 -> 其他链接器标志,并在调试和发布中的其他链接器标志中添加 $(inherited)。 - Mihir Oza
@boro,您已经有了答案,但请发布它而不是评论!!!无论如何感谢您。 - Ashwin G
@AshwinG 谢谢,已发布:https://dev59.com/3F8d5IYBdhLWcg3wsDxW#36197722 - boro
显示剩余7条评论
12个回答

54
  • 首先要确保你的静态库包含所有架构。在终端上执行lipo -info myStaticLibrary.a命令时,应该看到你的fat二进制文件具有armv7 armv7s i386 x86_64 arm64这些架构。

  • 为了实现这个目标,我假设你正在创建一个通用二进制文件 - 在静态库项目的架构设置中添加以下内容 -

enter image description here

  • 所以,你可以看到我需要手动设置静态库项目的Standard architectures (including 64-bit) (armv7, armv7s, arm64)

enter image description here

  • 或者,由于普通的$ARCHS_STANDARD现在包括64位。你也可以使用$(ARCHS_STANDARD)armv7s。去掉它,然后检查lipo -info,你就会发现缺少的架构。以下是包括所有架构的屏幕截图 -

enter image description here

  • 对于你的参考实现(使用静态库的项目),默认设置应该可以正常工作 -

    enter image description here

更新12/03/14Xcode 6标准架构不包括armv7s。

那么,armv7s不需要吗?是的。看起来,armv7和armv7s指令集之间的一般差异很小。因此,如果您选择不包含armv7s,则面向armv7的机器代码仍可以在32位A6设备上正常运行,并且几乎没有人会注意到性能差距。来源

如果有更聪明的方法适用于Xcode 6.1+(iOS 8.1及以上)- 请分享。


1
为什么在指定ARCHES_STANDARD应该有64位的情况下,你必须专门指定ARCHES_STANDARD_INCLUDING_64_BIT? - yogsma
1
@yogsma 很好的观点。正常的 $ARCHS_STANDARD 现在包括 64 位。你也可以使用 $(ARCHS_STANDARD)armv7s。正在更新答案。 - raurora
1
@yogsma 如果这个回答解决了你的问题,请点击勾选标志接受答案。这将把它从“未回答”列表中移除,并增加人们回答你未来问题的机会。 - raurora
1
谢谢,我会尝试的,但是它没有解决我的问题。如果能解决我的问题,我倒是很擅长接受答案,即使有时并不能。我还在努力解决。 - yogsma
1
@yogsma,您能解释一下问题的性质吗?只需将其作为“更新”添加到您的问题中-显示在按照上述步骤后所做的内容。 - raurora
显示剩余9条评论

27
如果您正在构建一个通用库并需要支持模拟器(x86_64),则通过将Build Active Architecture Only设置为No来为所有平台构建框架。 enter image description here

1
这对我有用,但只有在我将所有目标(包括框架)设置为“否”之后才有效。 - ScottyB

11

许多人在其目标的运行脚本中使用此处找到的构建脚本:   http://www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial 或者在这里:   https://gist.github.com/sponno/7228256

我曾经尝试通过将x86_64、i386、armv7s、armv7和arm64添加到“Architectures”部分来解决问题,但是lipo -info targetname.a在成功构建后从未返回这些架构,这让我非常苦恼。

在我的情况下,我必须修改目标运行脚本,特别是来自gist链接的第1步,手动使用-arch包括这些体系结构。

第1步。 构建设备和模拟器版本 xcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" xcodebuild -target ${PROJECT_NAME} -configuration ${CONFIGURATION} -sdk iphonesimulator -arch x86_64 -arch i386 -arch armv7 -arch armv7s -arch arm64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"


我认为我遇到了相同的问题,但对我来说,添加“-arch”会导致xcodebuild命令在不构建任何内容的情况下默默地终止(我将上面的输出转储到/tmp,并且没有使用“-arch”就可以获得BUILD SUCCEEDED消息,但是带有“-arch”的话,在Build settings from command line信息后就无法继续了)。 - Alexander Tsepkov
对我来说,“-arch”参数出现了问题,尽管成功设置了ARCHS变量,但并没有成功构建。然而,在命令本身中定义“ARCHS ='i386 x86_64'”解决了我的问题。 - Alexander Tsepkov

11

这是关于你最近提出的有关 x86_64arm64 差异的回答:

  • 运行64位模拟器需要x86_64架构。

  • 运行64位设备(iPhone 5s、iPhone 6、iPhone 6 Plus、iPad Air、iPad mini with Retina display)需要arm64架构。


4
我使用lipo命令手动合并两个静态库。
例如:我有一个要构建的静态库(libXYZ.a)。
我在Generic iOS Device上运行构建,并在Debug-iphoneos/中获得了产品。
$ lipo -info Debug-iphoneos/libXYZ.a
Architectures in the fat file: Debug-iphoneos/libXYZ.a are: armv7 arm64

然后我在任何一个iOS模拟器上运行构建,并在Debug-iphonesimulator/中获得产品。

$ lipo -info Debug-iphonesimulator/libXYZ.a
Architectures in the fat file: Debug-iphonesimulator/libXYZ.a are: i386 x86_64

最后,我将所有架构合并成一个。
$ lipo -create Debug-iphoneos/libXYZ.a Debug-iphonesimulator/libXYZ.a -output libXYZ.a
$ lipo -info libXYZ.a
Architectures in the fat file: libXYZ.a are: armv7 i386 x86_64 arm64

4

我遇到了完全相同的问题并且正在按照这个教程进行操作: https://github.com/jverkoey/iOS-Framework#faq

我使其正常工作的方法是,在将脚本输入聚合的构建阶段之后,在编译之前,确保您使用iPhone模拟器(我使用的是iPhone6),而不是IOS设备进行编译。

这将为我提供2个片段:armv7和x86_64,然后将其拖放到新项目中,对我来说可以很好地工作。


1
经历了很多,但这个方法行得通。我只需要选择一个模拟器来构建我的框架。谢谢! - jer_francis

1
将“仅设置构建活动架构”为“否”对我解决了这个问题。 在此输入图片描述

这个设置在哪里? - undefined

1

我的解决方案是连接我的iPhone 6,在其上构建,并成功运行该项目。

因为我是为iPhone 6模拟器构建的。


你有任何想法为什么模拟器失败了吗? - Muhammad Asyraf

0
如果您在使用react-native项目中遇到了某个外部库的问题,您应该将该项目删除并再次使用react-native link <package-name>。这样应该可以解决问题。

0

你需要做出以下更改(将架构更改为armv7并删除其他内容):

Change you have to make


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