【问题标题】:Arm64 architecture in xcode 5.1xcode 5.1 中的 Arm64 架构
【发布时间】:2014-03-11 10:31:56
【问题描述】:

在新的 XCode 5.1 中,arm64 已成为构建的标准架构之一。

但是,在我当前的项目中,我包含了尚不支持这种新架构的库(例如 Google AdMob) - 这些现在会导致链接器错误:

ld: symbol(s) not found for architecture arm64

例如,Google AdMob 6.8.0 是 said to be supporting arm64,但我无法真正确认这一点,除非 cputype (16777228) cpusubtype (0) 是 arm64? (通过文件命令行工具找到)

libGoogleAdMobAds.a: Mach-O universal binary with 5 architectures
libGoogleAdMobAds.a (for architecture armv7):   current ar archive random library
libGoogleAdMobAds.a (for architecture armv7s):  current ar archive random library
libGoogleAdMobAds.a (for architecture i386):    current ar archive random library
libGoogleAdMobAds.a (for architecture x86_64):  current ar archive random library
libGoogleAdMobAds.a (for architecture cputype (16777228) cpusubtype (0)):   current ar archive random library

有没有办法解决这个问题?

【问题讨论】:

  • 你能显示完整的错误日志吗?
  • 您是否检查过您使用的库是否有更新。另一种选择可能是取消对 arm64 的支持,但不确定 Apple 是否会接受您的应用。
  • 不幸的是,您将无法使用这些库的这些版本,直到它们更新为对 arm64 架构的编译支持。尝试看看这些库是否有任何更新。
  • 如果您有库的源代码,请为 arm64 重建它们。
  • 是的cputype (16777228) cpusubtype (0)表示arm64,看我的answer here

标签: ios objective-c xcode xcode5.1


【解决方案1】:

暂时摆脱arm64并不难。您需要做的就是:

  • 编辑您的目标构建设置。通过打开下拉列表更改 Architectures 的值,单击 Other... 并选择它,删除值为 $(ARCHS_STANDARD) 的行strong> 并添加两行值:armv7armv7s(或 $(ARCHS_STANDARD_32_BIT) >nschum),关闭弹出窗口。

  • 编辑值 Valid Architectures 并简单地删除它的 arm64 部分。

  • 为您的工作区或项目中可能拥有的每个嵌套项目执行此操作。

注意:这不是解决方案,它只是缓解您当前问题的几个步骤,请继续关注您的依赖项目以了解它们何时具有 arm64 兼容性并恢复这些设置的更改尽快。

祝你好运

【讨论】:

  • 您可以将其设置为$(ARCHS_STANDARD_32_BIT),而不是将Architectures设置为armv7armv7s
  • @nschum 编辑了我的答案以反映您的精彩提示。
  • 这也为我修复了它。我希望苹果很少有这种东西。当某些事情昨天有效然后无效时,这令人抓狂。
  • @mrjre 您可能感兴趣:How does accepting an answer work?
  • @lppier,它可以在任何 64 位 iDevice 上本地运行。你看,由于向后兼容性,几乎每个 64 位处理器都运行 32 位应用程序,否则当引入 64 位设备时,它们可能无法运行 App Store 上的任何应用程序......无论如何,你总是可以通过运行你的应用程序来确保在 iPad iOS 7(64 位)模拟器中
【解决方案2】:

从 Xcode 5.1 开始,$(ARCHS_STANDARD) 现在包括 arm64(以及 armv7 和 armv7s),而在 Xcode 5.02 中,$(ARCHS_STANDARD) 仅包括 armv7 和 armv7s。

对于 Xcode 5.1

$(ARCHS_STANDARD) = armv7 armv7s arm64

$(ARCHS_STANDARD_32_BIT) = armv7 armv7s

因此,如果您必须以 64 位编译,那么您需要确保所有包含的库都具有 64 位切片。如果它们还不支持 64 位,那么您将不得不编译为 32 位。

但在任何一种情况下,在您的目标构建设置下,您都需要确保架构和有效架构设置相同并且它们匹配(见下图)。因此,您可以同时使用 $(ARCHS_STANDARD) 尝试它们,如果它无法编译,那么您可以使用 $(ARCHS_STANDARD_32_BIT) 尝试它们,理论上这将消除错误并编译一个工作项目。

-

对于带有 arm64 armv7s 和 armv7 的 64 位系统来说:

-

或者像这样只用于带有 armv7s 和 armv7 的 32 位(不带 arm64):

【讨论】:

  • 永远不要接触有效的架构。
  • @matt - 改变有效架构有缺点吗?我一直将它们设置为相同(对我而言)效果很好。
  • 没有必要。 arm64 有效的。如果它未在架构下列出,则不会构建它,这就是您需要做的所有事情。
  • 嗨@matt 从有效架构中删除 arm64 会导致应用无法在 iPad Air 上运行吗?好奇。
  • “有效架构”是编译器可以排除的所有架构。目标“架构”构建设置被这些掩蔽,以确定构建哪些架构。没有理由修改它。
【解决方案3】:

在您的目标的构建设置中,将“有效架构”更改为仅您支持的那些;在这种情况下可能是 armv7 和 armv7s。

如果您使用的是 Cocoapods,请务必为 Pods 项目中的所有目标更改此设置,并将所有这些目标的“仅构建活动架构”设置为所有方案的“否”。

对您的 podfile 进行的小改动以自动从您的 cocoapods 目标中移除 64 位构建架构,详见此处: http://cameronspickert.com/2014/01/20/remove-the-arm64-architecture-from-cocoapods-targets

【讨论】:

【解决方案4】:

在 XCode 5.1 上将架构设置为 $(ARCHS_STANDARD_32_BIT) 有效。无需从有效架构中删除 arm64

架构指定要构建的实际架构,并会忽略有效架构中的 arm64 条目(它指定超集)。希望 Apple 尽快解决此问题。

【讨论】:

    【解决方案5】:

    我有同样的错误。下载新版 Google AdMob SDK 6.8.0 解决了这个问题。 链接在这里: https://developers.google.com/mobile-ads-sdk/download#downloadios

    因此,没有必要禁用 arm64 架构。

    【讨论】:

    • admob sdk 6.8.0 没有为我解决问题。架构 x86_64 的未定义符号 _AVAudioSessionPortBuiltInSpeaker、_AVAudioSessionPortHeadphones、_OBJC_CLASS_$_AVAudioSession、_OBJC_CLASS_$_CTTelephonyNetworkInfo
    • @ArnoldTang 好像你忘记导入一些库而不是 ARM64 相关问题。
    • MrJre 是正确的。您列出的符号与 Google SDK 无关。您需要导入 AVFoundation 框架。
    • @RawMean 感谢您的提示。这是因为我正在从 6.5.0 更新到 6.8.0。在查看发行说明后,我才意识到 SDK 现在需要链接到 AVFoundation 和 CoreTelephony。
    【解决方案6】:

    没有一个答案对我有用。
    我终于提交了我的应用程序安装旧的 Xcode 5.0.2 除了 Xcode 5.1
    使用此版本的 Xcode 归档应用程序时不会出错。

    下载旧版 Xcode 5.0.2 here(您必须使用您的 Apple ID 登录):

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      相关资源
      最近更新 更多