彻底解决"symbols not found for architecture xxx"

这是一个经典的编译报错问题。相信大部分做iOS开发的同学都遇到过。刚开始遇到这个问题时,我会先尝试去改改build settings里面的配置,或者寄希望于clean,实在搞不定的时候,就到网上去搜,搜到的解决方法确实很多,但是能够解决问题的却很少,那是因为导致该问题的原因非常多,别人的方法不一定适用。后来认识到这样的解决问题思路是错误的。不应该没有目的地去尝试,而应该从关键的提示"symbols not found for architecture xxx"入手,分析出可能导致该问题的原因,然后再有目的地去解决问题,做到对症下药,这样效率才会高。

"symbols not found for architecture xxx",意思是二进制代码中缺少xxx(如arm64,下文以arm64为例)架构。编译器的错误提示肯定不会错,那么为什么二进制代码中会缺少xxx呢?在解决问题之前,不妨先分析一下。

项目中的二进制代码一般有两个来源,一是项目build实时编译出来的,二是引入的第三方库(这里指已经编译成二进制的第三方库,如.a或.framework文件)。对于第一种情况,毫无疑问,肯定是编译时遇到某种问题,导致编译不成功,因而缺少arm64;对于第二种情况,因为是已经编译完成的,则有两种可能。第一种可能是第三方库本身就不包含arm64,第二种可能是,虽然第三方库包含了arm64,但是编译器却没有找到。总结一下,导致该问题的本质原因大概有三种:

  • 确实不存在arm64
  • 存在arm64但是找不到
  • 因为某种原因编译不成功

抓住这三种本质原因,是解决问题的关键。下面逐一举一些这几种原因的例子和解决方案。

一、二进制中确实不存在arm64

可以通过在终端中使用如下命令查看二进制文件所包含的架构:

lipo -info xxx

如得到结果:

$ lipo -info Hyphenate.framework/Hyphenate 

Architectures in the fat file: Hyphenate.framework/Hyphenate are: i386 x86_64 

说明该二进制中确实不包含arm64,如果引入了这样的二进制文件,在运行到真机时就会报错。

解决办法:

找到包含arm64架构的二进制文件。

二、存在arm64但是找不到

1、第三方库(.a或者.framework)没有添加到Linked Framworks and Libraries

有时候引入第三方库(主要是静态库,如.a文件),是包含arm64架构的,但是导入工程时方式不对,使得.a文件没有添加到Linked Framworks and Libraries列表中,这时候编译器编译时会找不到该.a文件,就会报错。

Linked Framworks and Libraries

解决办法:

将相应的.a文件添加到Linked Framworks and Libraries中,就能解决问题。

2、第三方库(.a或者.framework)缺少系统依赖库

有些第三方库,本身是依赖一些系统库的,以Bugly为例,在官网上的集成文档中,就会提醒用户添加依赖,需要添加的依赖有:

bugly集成文档片段
  • SystemConfiguration.framework
  • Security.framework
  • libz.dylib 或 libz.tbd
  • libc++.dylib 或 libc++.tbd

需要把这些依赖库添加到Linked Framworks and Libraries。如果忘记添加这些,编译器无法编译库文件,因此就会找不到,就会报错。

解决办法:

将第三方库的依赖系统库添加到Linked Framworks and Libraries中

三、因为某种原因编译不成功

1、building settings中architecture不包含arm64

这种情况应该大部分人都知道,你告诉编译器不编译arm64的架构,但是又要运行在arm64架构的手机上,当然会报错啦。

解决办法:

这种情况的解决办法就是,在building settings中,architectures中添加arm64架构。

2、.m文件没有添加到build phase

有时候因为某种原因,使得.m文件没有添加到build phases, Compile Sources中,导致编译失败,也会报这种错误。

解决办法:

在build phases, Compile Sources中重新添加.m文件。

3、.m文件重复

项目中如果存在,两个相同的.m文件,同样会导致编译失败,也会报这种错误。

解决办法:

删除重复的.m文件。

4、-ObjC配置

集成第三方库时,有时候需要做-ObjC配置,-ObjC的作用是将静态库中任何Objective-C代码都链接到APP中,不配置的话,有时会使工程因文件找不到编译失败,会报这种错误。

解决办法:

Build Settings -> Linking -> Other Linker Flags ,添加上 -ObjC

5、集成含C++的库

有些第三方库包含C++代码,用C++编译器编译得到的。如果引入了这种第三方库(最典型的例子是百度地图SDK),工程也需要使用C++编译器编译,否则会因编译失败报错。

解决办法:

最简单的解决办法是将工程中任意一个.m文件改成.mm后缀。

6、bitcode问题

有时候如果引入的第三方库没有使用bitcode,但是主工程中building settings的Enable Bitcode开关打开了,会引起编译失败,也会报"symbols not found for architecture xxx"错误,当然也会有bitcode关键字的错误提示,比较明显,也比较好解决。

解决办法:

将主工程中Enable Bitcode开关关闭。

目前只想到这些,但实际中肯定不止这些,后面遇到了再更新。只要把握造成该问题的本质原因,相信任何这种报错的问题都能够迎刃而解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342