在开发过程中,经常会遇到这么一个看似莫名其妙的报错,经常发生在添加了某个静态库,或者某个类,或者一些第三方的库文件.
而且报错的信息中,总有这么一句话:
ld: symbol(s) not found for architecture x86_64
其中一次的详细信息如下:
Undefined symbols for architecture x86_64这是在我添加了一个之前封装的对数据库操作的工具类时引起的,有点毫无头绪,首先想到的当然是求助万能的网络,搜了一些资料,也确实看到了很多人经常遇到这个问题:
有的说是缺少依赖库;
有的说在Build Setting-->Linking-->Other Linker Flags添加-licucore;
但是都没有解决问题,最后,看到一个提到了缺少文件的引用,但是怎么查找缺少的文件,并没有提及,经过了一些时间的摸索,总算解决了这个问题;
引起这个问题的原因大致有以下几种:
1. 项目中含有静态库
如果项目中引用了静态库,可能是该静态库不支持在模拟器下编译,可使用真机或Generic iOS Device,一般就不会出现这个错误了;
2. 未自动引用编译文件
这个问题就比较隐秘了,查找起来也不是特别的方便,一般在我们新建了一个类,或者往项目中添加了一些其他的类库,在项目配置的Build Phases-->Compile Sources下会自动添加对编译文件(.m文件)的引用,有的时候却不会自动引用,就会引起这个报错,这个时候就需要自己手动添加了.
那么,怎么查看是哪个文件的编译文件未引用呢?
从上面的错误信息""_OBJC_CLASS_$_FMDataBase",referenced from:"
中能够看出,是缺少FMDataBase文件的引用;
手动添加编译文件引用解决方法:
在Build Phases-->Compile Sources(items)中,添加报错的.m文件,点左下角的"+",在弹出框中找到报错的.m文件,选中,add即可,
这时再编译项目,会发现这个报错就没有了...
PS: 笔者这次遇到的问题就是这个原因引起的...
这里给出与此相关的另外一个情形:
有时候我们不需要某个文件了,把他从项目中删除了,但是编译时会报错:
No such file or directory:.......
就是文件不存在,引起这个报错有可能是因为,你虽然把文件从项目中删除,但是这里还在引用那个已经被你删除的编译文件(.m文件);
解决方法很简单,只需要在这里找到那个.m文件,然后点击左下角的- 删除即可....
3. 缺少文件
如果以上还不能解决问题,有可能是项目中缺少文件,一般是在从SVN更新代码的时候,虽然代码更新到了本地仓库,但是没有添加到项目中,就是在左侧列表中没有这个文件,这时候就需要手动将相应的文件引入到项目工程中;
同样,从""_OBJC_CLASS_$_FMDataBase",referenced from:"
能够看出,是缺少FMDataBase文件,
在左侧文件列表:右键-->选择"Add Files to ...",找到缺少的文件,选中后add即可!
PS:如果找不到,可问下创建这个文件的小伙伴,把它放在哪个文件夹下面了...
总结
引起编译报错的原因很多,以上是笔者遇到这个问题的不同情形,以及相应的解决方法,如果这些都不能解决你的问题,可以留言告知错误情形,以及解决的方式,感谢!
网友评论