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

最近我将我的操作系统从 6.0 更新到了 Yosemite 和 Xcode 到 6.1。我在 Stack Overflow 上搜索了这个引用 Xcode 5.1 的问题,并尝试了所有给定的解决方案,但没有任何效果。

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

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

4

12 回答 12

54
  • 您应该确保的第一件事是您的静态库具有所有架构。当你lipo -info myStaticLibrary.a在终端上做 - 你应该看到armv7 armv7s i386 x86_64 arm64你的胖二进制文件的架构。

  • 为此,我假设您正在制作通用二进制文件 - 将以下内容添加到静态库项目的体系结构设置中 -

在此处输入图像描述

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

在此处输入图像描述

  • 或者,因为正常$ARCHS_STANDARD现在包括 64 位。你也可以做$(ARCHS_STANDARD)armv7s。检查lipo -info没有它,你会找出缺失的架构。这是所有架构的屏幕截图 -

在此处输入图像描述

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

    在此处输入图像描述

2014 年 3 月 12 日更新 Xcode 6 标准架构不包括 armv7s。

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

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

于 2014-10-24T18:52:54.603 回答
27

如果您正在构建一个通用库并且需要支持模拟器 (x86_64),那么通过设置Build Active Architecture OnlyNo. 在此处输入图像描述

于 2015-04-06T14:02:37.203 回答
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}"

于 2015-06-11T19:38:19.617 回答
11

x86_64这是对您关于和之间区别的最新问题的回应arm64

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

  • arm64运行 64 位设备(iPhone 5s、iPhone 6、iPhone 6 Plus、iPad Air、带 Retina 显示屏的 iPad mini)需要架构。

于 2016-03-24T10:14:53.447 回答
4

我遇到了完全相同的问题,并按照本教程 https://github.com/jverkoey/iOS-Framework#faq

我完成这项工作的方式是在将脚本放入聚合的构建阶段之后,在编译之前,确保使用 iphone 模拟器(我使用 iPhone6)而不是 IOS 设备进行编译。

这将给我 2 个切片:armv7 和 x86_64,然后将其拖放到新项目中对我来说效果很好。

于 2014-12-18T16:58:46.363 回答
3

我使用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
于 2018-04-25T03:34:50.480 回答
1

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

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

于 2018-04-10T01:18:50.520 回答
1

将 build active architectures 设置为 No 为我解决了这个问题。在此处输入图像描述

于 2018-10-27T02:30:41.290 回答
0

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

你必须做出的改变

于 2016-05-17T09:14:42.137 回答
0

另一件需要注意的事情是 XCode 对库导入的处理很糟糕,在许多情况下,解决方案是在项目中找到导入的文件,在 Finder 中或从命令行中删除它并重新添加它,否则它XCode 不会正确更新。通过 XCode 将旧文件留在那里,您一直在循​​环运行,不理解它为什么不编译、缺少架构等。

于 2018-02-19T14:56:24.920 回答
0

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

于 2018-07-21T23:22:54.470 回答
0

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

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

我通过以下方式修复了它:

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

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

  1. 进入项目的“构建设置”,然后将“仅构建活动架构”更改为“是”,清理,重建,没有错误,最后!
于 2021-02-06T07:20:06.517 回答