XCode/iOS 常见编译错误、链接错误浅谈
楔子
俗话说使出必有因,笔者写这篇文章也是源自这两天遇到的一个具体问题。笔者公司产品新版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 这个问题和静态函数声明有关(非静态声明后面跟着静态声明)
2YYKit
代码本身没有问题,问题出在工程中其他代码上
貌似是同一个函数名有了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
添加静态库的相应路径