美文网首页BUGs
[Error]Xcode编译报错:ld: symbol(s) n

[Error]Xcode编译报错:ld: symbol(s) n

作者: 流火绯瞳 | 来源:发表于2016-07-07 10:51 被阅读499次

    在开发过程中,经常会遇到这么一个看似莫名其妙的报错,经常发生在添加了某个静态库,或者某个类,或者一些第三方的库文件.
    而且报错的信息中,总有这么一句话:

    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:如果找不到,可问下创建这个文件的小伙伴,把它放在哪个文件夹下面了...

    添加文件

    总结

    引起编译报错的原因很多,以上是笔者遇到这个问题的不同情形,以及相应的解决方法,如果这些都不能解决你的问题,可以留言告知错误情形,以及解决的方式,感谢!

    相关文章

      网友评论

        本文标题:[Error]Xcode编译报错:ld: symbol(s) n

        本文链接:https://www.haomeiwen.com/subject/xiqljttx.html