【问题标题】:Xcode 6.1 Missing required architecture X86_64 in fileXcode 6.1 文件中缺少所需的架构 X86_64
【发布时间】:2014-12-20 13:59:28
【问题描述】:

在 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 的问题,并尝试了所有给定的解决方案,但没有任何效果。

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

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

【问题讨论】:

  • 您是在使用静态库还是仅在编译您自己的项目时出现此错误?
  • 编译我自己的项目
  • 所以,您使用的是第三方库,不支持 64 位版本(参考ClientAuthenticator.m)。尝试从 Target / Build Settings / Architectures / Valid Architectures 中删除 arm64 然后编译?截图 - i.imgur.com/Rqwr97G.png
  • 所以,现在您问对了问题。我会发布一个答案。
  • x86_64 架构是运行 64 位模拟器所必需的。运行 64 位设备(iPhone 5s、iPhone 6、iPhone 6 Plus、iPad Air、带 Retina 显示屏的 iPad mini)需要arm64 架构。

标签: ios xcode6.1


【解决方案1】:

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

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

我通过以下方式修复它:

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

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

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

【讨论】:

    【解决方案2】:

    将构建活动架构设置为“否”为我解决了这个问题。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我使用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
        

        【讨论】:

          【解决方案5】:

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

          因为我正在为 iPhone 6 模拟器构建。

          【讨论】:

          • 你知道为什么模拟器会失败吗?
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            你必须做的改变就是这样(将架构更改为 armv7 并删除其他架构):-

            【讨论】:

              【解决方案8】:

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

              • x86_64 架构是运行 64 位模拟器所必需的。

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

              【讨论】:

                【解决方案9】:

                许多使用在这里找到的构建脚本: 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}"

                【讨论】:

                • 我想我遇到了同样的问题,但是为我添加 -arch 会导致 xcodebuild 命令静默终止而不构建任何东西(我将上面的输出转储到 /tmp,我得到了在没有 -arch 的情况下构建成功的消息,但不要通过带有 -arch 的 Build settings from command line 消息)
                • 已修复,对我而言,-arch 参数由于某种原因未能成功构建,尽管成功设置了 ARCHS 变量。但是,将ARCHS='i386 x86_64' 定义为命令本身的一部分为我解决了这个问题。
                【解决方案10】:

                如果您正在构建一个通用库并且需要支持模拟器 (x86_64),那么通过将 Build Active Architecture Only 设置为 No 来构建适用于所有平台的框架。

                【讨论】:

                • 这对我有用,但只有在我将所有目标(包括框架)设置为“否”之后。
                【解决方案11】:

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

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

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

                【讨论】:

                • 经历了很多,但这就是我在选择模拟器的情况下构建我的框架所需要的技巧。谢谢!
                【解决方案12】:
                • 您应该确保的第一件事是您的静态库具有所有架构。当您在终端上执行 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 年 12 月 3 日更新 Xcode 6 标准架构不包括 armv7s。

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

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

                【讨论】:

                • 为什么必须专门指定 ARCHES_STANDARD_INCLUDING_64_BIT ,而 ARCHES_STANDARD 应该有 64 位
                • @yogsma 好点。普通的$ARCHS_STANDARD 现在包括 64 位。您也可以使用$(ARCHS_STANDARD) 和armv7s。更新答案。
                • @yogsma 如果这回答了您的问题,请单击复选标记图标接受答案。这会将其从“未回答”列表中删除,并增加人们回答您未来问题的机会。
                • 谢谢,我会的,但它并没有解决我的问题。如果它解决了我的问题,我很擅长接受答案,有时即使它没有。我还在努力。
                • @yogsma 你能解释一下这个问题的本质吗?只需将其作为“更新”添加到您的问题中 - 显示您在执行上述步骤后所做的事情。
                猜你喜欢
                • 2015-01-26
                • 2015-10-10
                • 2013-10-15
                • 2016-02-03
                • 2013-12-14
                • 1970-01-01
                • 1970-01-01
                • 2015-04-23
                • 1970-01-01
                相关资源
                最近更新 更多