Xcode 5.1中的Arm64架构

63

在新的XCode 5.1中,arm64已经成为构建应用程序的标准体系结构之一。

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

ld: symbol(s) not found for architecture arm64

例如,Google AdMob 6.8.0据说支持 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

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


你能否展示完整的错误日志? - Mani
你是否检查过你所使用的库是否有更新。另一个选择可能是移除对arm64的支持,但不确定苹果是否会接受你的应用程序。 - rckoenes
如果你有库的源代码,请为arm64重建它们。 - KudoCC
3
"Yes cputype (16777228) cpusubtype (0) means arm64, see my answer here" 可以翻译为:"是的,cputype (16777228) cpusubtype (0) 表示 arm64,具体请参考我在这里的回答(链接:https://dev59.com/EH3aa4cB1Zd3GeqPb1rH#22259130)。" - Emmanuel
看到这个答案对我有用。 https://dev59.com/Ln3aa4cB1Zd3GeqPdnqj#22682667 - Hardik Darji
显示剩余2条评论
6个回答

109

暂时摆脱arm64并不难。您只需要:

  • 编辑目标构建设置。通过打开下拉菜单更改Architectures的值,点击Other...并选择它,删除行中的值$(ARCHS_STANDARD),并添加两行值:armv7armv7s(或如@nschum所提到的$(ARCHS_STANDARD_32_BIT)),关闭弹出窗口。

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

  • 对于您可能在工作区或项目内拥有的每个嵌套项目都执行此操作。

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


这对我也解决了问题。我希望苹果能够更加关注这些细节。当昨天还好好的,今天却突然不行了,这真是让人抓狂。 - vboombatz
@mrjre 你可能会对以下内容感兴趣:采纳答案是如何工作的? - M. Porooshani
@StevenLu 没错。你仍然可以按照答案中描述的步骤来实现。祝好运。 - M. Porooshani
嗨@nschum,$(ARCHS_STANDARD_32_BIT)可以工作,但我担心我的应用程序在iPad Air上无法运行。有人能保证它会运行吗?不想等2个星期才发现! - lppier
3
@lppier,它可以在任何64位的iDevice上本地运行。你知道,由于向后兼容性,几乎每个64位处理器都可以运行32位应用程序,否则当64位设备推出时,它们将无法运行App Store中的任何应用程序...不管怎样,您可以通过在iPad iOS 7(64位)模拟器中运行您的应用程序来确保其兼容性。 - M. Porooshani
显示剩余4条评论

19

从 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位。

但无论哪种情况,在目标构建设置下,您都需要确保 Achitectures 和 Valid Achitectures 都设置为相同并且匹配(参见下面的图像)。 所以您可以尝试使用 $(ARCHS_STANDARD) 进行编译,如果无法编译,则可以尝试使用 $(ARCHS_STANDARD_32_BIT),理论上将消除错误并编译工作项目。

-

64位的 arm64 armv7s 和 armv7 设置如下:

enter image description here

-

或者 32位的 armv7s 和 armv7 设置如下(不包括 arm64):

enter image description here


永远不要触碰有效架构。 - matt
@matt - 更改有效架构是否有不利之处?我一直将它们设置为相同的(对我来说)效果很好。 - jsherk
没有必要这样做。而且arm64是有效的。如果它没有列在架构下,它就不会被构建,所以你只需要这样做。 - matt
嗨@matt,从有效架构中删除arm64会导致应用在iPad Air上无法工作吗?好奇。 - lppier
“有效架构”是编译器可以接受的所有架构。目标“架构”构建设置与这些掩码以确定要构建哪些架构。没有理由修改它。 - geowar

6
在您的目标构建设置中,将“有效架构”更改为仅支持您支持的架构;在这种情况下可能是armv7和armv7s。
如果您正在使用Cocoapods,请确保将所有目标的这些设置更改为Pods项目中的所有目标,并将所有这些目标的“仅构建活动体系结构”设置为所有方案的“否”。
您可以通过在Podfile中进行小的更改来自动删除Cocoapods目标中的64位构建架构,详情请参见此处:http://cameronspickert.com/2014/01/20/remove-the-arm64-architecture-from-cocoapods-targets

3
http://cameronspickert.com/2014/01/20/remove-the-arm64-architecture-from-cocoapods-targets介绍了如何自动修改Pods目标。 - nschum
很棒的见解,@nschum! - karlbecker_com

5

在XCode 5.1中将架构设置为$(ARCHS_STANDARD_32_BIT)即可正常工作,无需从有效架构中删除arm64

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


1

没有一个答案适用于我。
最终,我除了Xcode 5.1之外还安装了旧版本的Xcode 5.0.2
使用这个版本的Xcode对应用程序进行归档而没有错误。

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


1

Admob SDK 6.8.0 对我来说并没有解决问题。 x86_64 架构下的未定义符号 AVAudioSessionPortBuiltInSpeaker、_AVAudioSessionPortHeadphones、_OBJC_CLASS$AVAudioSession、_OBJC_CLASS$_CTTelephonyNetworkInfo。 - Arnold Tang
@ArnoldTang,这似乎是你忘记导入一些库而不是ARM64相关问题。 - MrJre
MrJre是正确的。您列出的符号与Google SDK无关。您需要导入AVFoundation框架。 - RawMean
@RawMean 谢谢你的建议。我正在从6.5.0升级到6.8.0。在查看发布说明后,我才意识到SDK现在需要链接到AVFoundation和CoreTelephony。 - Arnold Tang

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