Undefined symbols for architecture arm64解决方案

在iOS开发中经常遇到的一个错误是Undefined symbols for architecture arm64,这个错误表示工程某些地方不支持arm64指令集。那我们应该怎么解决这个问题了?我们不仅要解决这个问题,更要了解出现这个问题的根源.这样根本上杜绝这类问题发生.

对于iOS设备来说iOS的指令集有armv6、armv7、armv7s、arm64这样四种,不同型号的iOS设备使用不同的指令集,下面是各自的区别:

armv6
iPhone、iPhone 3G
iPod 1G、iPod 2G
armv7
iPhone 3GS、iPhone 4
iPod 3G、iPod 4G、iPod 5G
iPad、iPad 2、iPad 3、iPad Mini
armv7s
iPhone 5、iPhone 5C
iPad 4
arm64
iPhone 5S   iPhone 6   iPhone 6Plus
iPad Air, Retina iPad Mini


在Xcode的target->Build Settings中有一个Architectures的分组主要是用来设置Architectures方面的内容,下面重点介绍下面几个设置项的内容。

Architectures

该编译选项指定了工程将被编译成支持哪些指令集,支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。

官方文档说明:

Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.

Build Active Architectures Only

该编译项用于设置是否只编译当前使用的设备对应的arm指令集。

当该选项设置成YES时,你连上一个armv7指令集的设备,就算你的Valid Architectures和Architectures都设置成armv7/armv7s/arm64,还是依然只会生成一个armv7指令集的二进制包。

当然该选项起作用的前提是你的Xcode必须成功连接了调试设备。如果你没有任何活跃设备,即Xcode没有成功连接调试设备,就算该设置项设置成YES依然还会编译Valid Architectures和Architectures指定的二进制包。

通常情况下,该编译选项在Debug模式都设成YES,Release模式都设成NO。

官方文档说明:

Boolean value. Specifies whether the product includes only object code for the native architecture.

Valid Architectures

该编译项指定可能支持的指令集,该列表和Architectures列表的交集,将是Xcode最终生成二进制包所支持的指令集。

比如将Valid Architectures设置支持的arm指令集版本有:armv7、armv7s、arm64,对应的Architectures设置的支持arm指令集版本有:armv7s,这时Xcode只会生成一个armv7s指令集的二进制包。

官方文档说明:

Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.

说明

1、指令集是向下兼容的。比如,armv7s指令集的设备,可以兼容运行使用armv7、armv6编译的程序。

示例

在做项目的时候,用到了第三方社交分享静态库是时候,会编译失败,先来看看下图

看,它忽略了那个静态库文件导致链接失败了,然后我查看了静态库所支持的架构,打开终端输入查看命令lipo - info xxx.a ,结果如下:

发现了这个静态库只支持armv7 armv7s i386 . 而在我的工程中Valid Architectures和Architectures中均包含了arm64的指令集,这就是说明我需要编译的app最终要支持arm64的,而程序中用到的静态库并没有arm64,所以才导致了出错,因此,需要我们去重新下载一个支持arm64的静态库文件,那么就可以正常编译通过了.


参考文档
1、《Xcode设置项之Architectures和Valid Architectures》

2、《xcode5 arm64》

3、《64-Bit Transition Guide for Cocoa Touch》

4、iOS开发之Architectures设置

5、Xcode设置项之Architectures和Valid Architectures

6、Xcode Build Settings中的Architecture概述

————————————————

转载于:https://blog.csdn.net/zuoyou1314/article/details/46638073

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个错误提示,表示在编译 Mac 应用程序时遇到了编译器找不到符号的问题,其中涉及到了 ARM64 架构。这通常是由于代码中使用了未定义的函数或变量,或者是链接器无法找到正确的库文件导致的。需要进一步检查代码,并确保库文件和符号都正确定义和链接。 ### 回答2: macOS是苹果公司的操作系统,不同于Windows和Linux,它专门为苹果公司的设备设计。在macOS中,开发人员们经常会遇到各种各样的编译错误和异常。这些错误很少是显而易见的,尤其是当你在编译器输出信息中看到了 “undefined symbols for architecture arm64” 时,你可能会感到很疑惑。让我们来深入了解一下这一异常信息的原因。 首先,我们需要理解什么是符号。符号在计算机科学中有着广泛的应用,它们是程序编译时被创建的一种元素,代表着函数、变量、类及其他定义,程序链接器将符号与实际的机器代码关联起来。在macOS中,arm64代表64位的ARM体系结构。在使用Xcode编译iOS或macOS应用程序时,错误信息中的 “undefined symbols for architecture arm64” 表示编译器打开了一个与设备CPU架构不兼容的库或文件,因此编译器无法正确识别它们。 为了解决这种问题,我们可以采取以下方法: 1. 更新库和文件 首先我们需要检查本地环境中使用到的库和文件是否都是与我们所使用的CPU架构兼容的版本。如果不兼容,则需要更新库和文件,确保它们能与你的CPU架构兼容。 2. 检查编译器选项 在使用编译器时,需要设置正确的选项来确保执行正确的CPU架构。我们需要检查编译器选项,确保目标CPU架构与所选选项一致。 3. 更新Xcode 如果上述两种方法都没有解决问题,那么我们可以考虑更新Xcode,确保它与我们所使用的CPU架构兼容。 总而言之,当你在编译器输出信息中看到了 “undefined symbols for architecture arm64” 时,它可能是由不兼容的库或文件引起的。我们需要更新库和文件、检查编译器选项以及更新Xcode以确保它们能够与我们所使用的CPU架构兼容。 ### 回答3: "mac undefined symbols for architecture arm64"错误通常指出了arm64的框架中存在未定义的符号。这通常会发生在编译或链接程序时,因为在架构中无法找到符号。 这个错误的最简单的解决方案是添加缺失的库或框架,或者确保正确地加载了库或框架。使用Xcode的话,在“Build Phases”的“Link Binary with Libraries”中添加必要的库或框架即可。 此外,这种错误也可能是由于优化标志设置不正确导致的。在Xcode的“Build Settings”中,您可以找到“Optimization Level”并尝试将其设置为“None”。 如果以上方法都不能解决问题,那么建议您观察错误行中指向未定义符号的位置,并查看相应的代码(通常是代码中缺少头文件或声明)。找到问题所在后,您可以将相应的库、框架或头文件添加到项目中。 最后,如果您不确定该怎么解决这个错误,请搜索相关的标识符和错误信息,以获取更多可能有用的信息。还可以向开发者社区寻求帮助,以获取更专业的建议和解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值