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概述

时间: 2024-10-14 05:58:50

Undefined symbols for architecture arm64解决方案的相关文章

真机提示Undefined symbols for architecture arm64

iOS程序模拟器手机运行都正常,archiving出错:Undefined symbols for architecture arm64 今天发现写好的程序可以在模拟器上运行也可以在手机上运行,但为什么Archive的时候出错了,出错信息如下: 意思是说 有几个类不支持arm64指令 出现Undefined symbols for architecture arm64错误,解决方法如下: 查看引入的微信包,发现 lipo -info libWeChatSDK.a文件后发现 仅支持armv7 ar

iOS Undefined symbols for architecture arm64解决办法

Undefined symbols for architecture arm64:  "_OBJC_CLASS_$_YYCache", referenced from:      objc-class-ref in LFNetworking.o  "_OBJC_CLASS_$_AFHTTPRequestSerializer", referenced from:      objc-class-ref in LFNetworking.o  "_OBJC_CL

更新cocoapods之后,出现Undefined symbols for architecture arm64

最近刚更新了cocoapods之后出现了 Undefined symbols for architecture arm64: ld: symbol(s) not found for architecture arm64 所有的第三方库都不支持 arm64. 由于之前的三方类库编译文件已存在,导致更新的类库无法编译!!!(查找了很多方法都无效,最终还是这个原因!) 只需要在libPods-xxxx.a点Show in Finder,将Products目录下文件全部清空,重新编译就好了.

Undefined symbols for architecture arm64:问题

Undefined symbols for architecture arm64: "_sqlite3_prepare_v2", referenced from: +[HMJSchoolTool queryWithCondition:] in HMJSchoolTool.o "_sqlite3_step", referenced from: +[HMJSchoolTool queryWithCondition:] in HMJSchoolTool.o "_

ios Undefined symbols for architecture arm64

我追加了 一个之前写的 关于加载的 .h.m文件 但是在我新追加其他工程里面 突然报错: Undefined symbols for architecture arm64: "_OBJC_CLASS_$_MBProgressHUD", referenced from: objc-class-ref in loginController.old: symbol(s) not found for architecture arm64clang: error: linker command

ios开发遇到如下错误:Undefined symbols for architecture arm64,我的解决方案

博客处女作,写得不好望谅解! “for architecture arm64”就是说没有支持arm64,在Build settings里architecture相关的几项需要配置正确 在最近升级cocoapod工具管理中,由于我们的工程版本号已经升级到了2.1了,所以升级过程中遇见了很多问题,折腾了好几天.这个问题便是其中一个.下面说说我们的解决方案 升级过后编译报 ld: can't link with a main executable file '/Users/WayneLiu_Mac/L

iOS开发遇到的坑之一: 开发遇见如下错误:Undefined symbols for architecture arm64

博客处女作,写得不好望谅解! “for architecture arm64”就是说没有支持arm64,在Build settings里architecture相关的几项需要配置正确 在最近升级cocoapod工具管理中,由于我们的工程版本号已经升级到了2.1了,所以升级过程中遇见了很多问题,折腾了好几天.这个问题便是其中一个.下面说说我们的解决方案 升级过后编译报 ld: can't link with a main executable file '/Users/WayneLiu_Mac/L

Undefined symbols for architecture arm64:

"_OBJC_CLASS_$_UIResponder", referenced from: _OBJC_CLASS_$_AppDelegate in AppDelegate.o "_OBJC_METACLASS_$_UIResponder", referenced from: _OBJC_METACLASS_$_AppDelegate in AppDelegate.o "_UIApplicationMain", referenced from:

Undefined symbols for architecture arm64(其cpu架构)

"_OBJC_CLASS_$_XXX",referenced from: 之类的问题,很多人看到这些很头疼,不知道从何下手去修改.以下是我总结的相关修改办法.如下图 这是一个很明显的在arm64架构下,找不到定义的错误.  这类错误我总结的就六种,.m 缺失.静态库没导入(不支持arm64 架构,现在基本都支持了,如果不支持更新相关静态库.怎么查看参考文末).library路径问题.header 文件路径.Valid Architectures 指定错误,连接器参数问题 1.那么首先检