XCode 6.1缺少文件中所需的体系结构X86_64

时间:2014-10-24 17:09:06

标签: ios xcode6.1

在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。我在Stackoverflow上搜索了这个涉及XCode 5.1的问题并尝试了所有给定的解决方案,但没有任何效果。

更新 - 我按照答案中的建议尝试了更改,但我仍然收到错误消息“缺少必需的体系结构X86_64 ”。在进一步调查中,我发现来自我的库的文件ClientAuthenticator.o没有为X86_64架构构建,可能这是问题所在?我正在寻找它如何为x86_64构建。

我的新问题是 arm64和x86_64之间有什么区别?更多的看起来只是架构制造商之间的区别,但基本的64位架构仍然是相同的。

12 个答案:

答案 0 :(得分:51)

  • 首先要确保静态库具有所有体系结构。当您在终端上执行lipo -info myStaticLibrary.a时,您应该看到您的胖二进制文件的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/14 Xcode 6标准体系结构不包括armv7s。

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

如果有更智能的Xcode 6.1+(iOS 8.1及更高版本) - 请分享。

答案 1 :(得分:24)

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

答案 2 :(得分: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添加到架构部分,只是为了找到lipo -info targetname.a在成功构建后永远不会返回这些架构。

在我的情况下,我必须修改目标脚本,特别是从gist链接中的第1步,使用-arch手动包含架构。

Step 1. Build Device and Simulator versions 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}"

答案 3 :(得分:9)

以下是对您关于x86_64arm64之间差异的最新问题的回复:

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

  • 运行64位设备需要
  • arm64架构(iPhone 5s,iPhone 6,iPhone 6 Plus,iPad Air,iPad mini和Retina 显示器)。

答案 4 :(得分:4)

我遇到了完全相同的问题并且正在学习本教程 https://github.com/jverkoey/iOS-Framework#faq

我做这项工作的方法是在编译之前将脚本放入Aggregate的Build阶段之后,确保使用iphone模拟器(我使用的是iPhone6)而不是IOS Device进行编译。

这将给我2个切片:armv7和x86_64,然后将其拖放到新项目中对我来说工作正常。

答案 5 :(得分:1)

我的解决方案是连接我的iPhone 6,在它上面构建,我让项目成功运行。

因为我正在为iPhone 6 Simulator构建。

答案 6 :(得分:1)

仅将构建活动体系结构设置为“否”为我解决了此问题。 enter image description here

答案 7 :(得分:0)

在进行更改之后,您必须做到这一点(将架构更改为armv7并删除其他架构): -

Change you have to make

答案 8 :(得分:0)

要注意的另一件事是XCode正在严格处理库导入,在许多情况下,解决方案是在项目中查找导入的文件,在Finder中删除它或从命令行删除它并再次添加回来否则它不会被XCode正确更新。通过XCode留下旧文件,你继续在圈子里运行,不理解为什么它没有编译,缺少架构等。

答案 9 :(得分:0)

我使用lipo命令手动组合两个构建的静态库。

EX:我有一个静态库(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 Simulator运行构建,并在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

答案 10 :(得分:0)

如果使用外部库之一在本机项目中遇到此问题。您应该删除该项目,然后再次使用react-native link <package-name>。那应该可以解决问题。

答案 11 :(得分:0)

我尝试使用上述所有方法,但在我的情况下没有任何效果。

我使用了导致此问题的 SumUp 库。

我通过以下方式修复它:

  1. 删除 -ObjC 参数(全部);在以前的 SumUp 库中,他们需要用参数填充 -ObjC 以使其工作,但是最新版本(在我回答时为 xc v4.0.1),文档说将其删除。

那仍然没有解决问题,我仍然看到到处都是错误,因此来到了这个线程,......但是,在尝试了以下设置后,它修复了它:

  1. 进入项目的“构建设置”,然后将“仅构建活动架构”更改为“是”,清理、重建、没有错误,最后!...

我希望这对使用 SumUP 集成的人有所帮助,花了一整天的时间才发现...

干杯,

H