美文网首页iOS开发其他@IT·互联网
XCode/iOS 常见编译错误、链接错误浅谈

XCode/iOS 常见编译错误、链接错误浅谈

作者: 蓝色小石头 | 来源:发表于2017-04-14 17:34 被阅读325次

    楔子

    俗话说使出必有因,笔者写这篇文章也是源自这两天遇到的一个具体问题。笔者公司产品新版APP提出需求,要在一富文本上的手机号可添加点击响应事件,由于iOS原生控件不像Android TextView autolink属性一样具备此属性,笔者自然而然地想起了YYKit这个著名的开源库。于是通过Cocoapods引入后进行编译,却报出了这个错误

    YYKit 编译报错 Static declaration of 'CGRectGetCenter' follows non-static declaration

    static inline CGPoint CGRectGetCenter(CGRect rect) {
    return CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));
    }

    于是乎各种百度、谷歌,毕竟天下之大,咱们现在遇到的问题,一般其他也有人遇到过。之后发现有不少这种报错,却没发现这种错误跟YYKit有什么关联。

    这个搜索结果表明了2个问题:
    1 这个问题和静态函数声明有关(非静态声明后面跟着静态声明)
    2 YYKit代码本身没有问题,问题出在工程中其他代码上

    貌似是同一个函数名有了2个不同的声明,全局搜索 CGRectGetCenter ,果然在另一处分类中发现了同名的非静态函数声明,修改一下问题解决。

    干货

    我们常用的C\C++\Objective-C等属于编译型语言,程序运行之前一般要进行预处理、编译、汇编、链接4大过程,下面是编译、链接时常出现错误的可能原因,本文内容会持续更新,希望对大家有所帮助,文中参考了一些大神的文章,再次表示感谢!

    linker command failed with exit code 1 错误总结

    1、新添加的文件跟之前文件同名
    2、错误信息中出现了某个类的名字,去原文件中看看#import了哪些第三方库,把这些库挨个注释排除,找到出错的那个库,然后按照官方提供的步骤重新添加一遍
    3、SVN或Git忽略了某些文件,如.o 等文件没能update下来,查看.o文件可能是红色的,可以重新添加或者修改SVN(git)的忽略设置
    4、把.a文件删除再重新拖到项目中解决问题
    5、重复添加了文件(没勾选 Copy items if neded 这个选项),建议删除后重新添加
    6、工程中文件名重复,也会出现同样的错误
    7、”Build Settings”->”Enable Bitcode”设置为NO ,因为有些SDK不支持Bitcode
    8、引用的时候可能写的是#import "XXXXX.m" ,如果是改为#import "XXXXX.h"
    9、导入的SDK只能在真机下才能运行,模拟器会报错!
    10、一个类中自定义创建的父类没有implementation部分,在此基础上继承的子类就报这样的错误了
    11、在不同的地方命名了相同的静态变量,不过这个真机调试不报错,模拟器运行的时候报错了

    例子

    1. 多人开发,你同步完成后发现出现如下的错误
    Undefined symbols for architecture armv7:    
      "_OBJC_CLASS_$_MyPageLogViewController", referenced from:    
          objc-class-ref in BaiduMobStatAppDelegate.o    
    ld: symbol(s) not found for architecture armv7    
    clang: error: linker command failed with exit code 1 (use -v to see invocation)    
    

    错误中出现了“MyPageLogViewController”这个类,你可以找到这个类的.m文件, 查看他的Target Membeship, 如下图

    如果没有勾选上,点击勾选。然后编译查看。

    2. 如果是新添加的第三方库,且不是静态库

    找到 Build settings->Linking->Other Linker Flags


    将此属性修改成-all_load 或者 -ObjC ,这个视情况而定。总之可以多试几次。
    3. 如果添加的是第三方静态库(.a文件)
    Undefined symbols for architecture armv7:    
      "_OBJC_CLASS_$_BaiduMobStat", referenced from:    
          objc-class-ref in BaiduMobStatAppDelegate.o    
          objc-class-ref in MyPageLogViewController.o    
         (maybe you meant: _OBJC_CLASS_$_BaiduMobStatAppDelegate)    
    ld: symbol(s) not found for architecture armv7    
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    在用到这个库的所有文件中都出现了错误, 如上BaiduMobStatAppDelegate类和 MyPageLogViewController
    这种情况就可能是这个静态库路径混乱导致的链接错误
    解决方法:Build settings->Search Path->Library Search Paths 添加静态库的相应路径

    相关文章

      网友评论

      本文标题:XCode/iOS 常见编译错误、链接错误浅谈

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