前段时间,接手新公司项目,发现换了电脑,svn下载代码,cocoapods以后,代码报错。直接拷过来也报错。于是就开始了漫长的调试过程。
首先是pod install以后出现下面问题:
LKDBHelper报错
这是pods文件夹里面的东西,出现这个问题就很奇怪了。然后就该考虑User Header Search Paths 与Header Search Paths的问题了。
首先要知道,Header Search Paths 顾名思义就是用来存放 Project 中头文件的搜索根源,没有被add到项目里的头文件,可以通过配置Header Search Paths 来引入头文件,这样的好处可以不让project 包含的文件太多,便于管理。
也就是说,编码时候通过 #import 引入头文件的方式有两种 <> 和 ""。<> 是只从 Header Search Paths 中搜索, 而 "" 则能从 Header Search Paths 和 User Header Search Paths 中搜索。换言之 ,假如你把 路径加到 User Header Search Paths 中,那么 你用 #import的方式去引入对应的头文件,就会报错。 如果加到 Header Search Paths, 就没有问题了。
具体一点的区别是,<> 是从系统目录空间 (对应 Header Search Paths)中搜索文件, "" 是从用户目录空间(对应 User Header Search Paths)中搜索文件。如果你把路径加到 User Header Search Paths 中,而 <> 无法从系统目录空间中找到新加的路径,从而报错。
然后我解决了这个问题,但是问题来了报错
Framework not found AFNetworking
这个问题还是真的比较难办,看了一下Framework Search Paths 和Library Search Paths都没啥问题。这个时候看了一个Build Active Architecture Only的属性
然后我查了一下,答案都是一样的,不知道谁是原创。就把内容整理出来吧。
Architectures
这代表,在这个项目里你想要Xcode编译的目标设备列表。
Build Active Architecture Only
这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本。
而设置为no时,会编译所有的版本。
这个是设备对应的architecture:
armv6:iPhone 2G/3G,iPod 1G/2G
armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G
armv7s:iPhone5, iPod5
arm64:iPhone5s,ipad air,ipad mini2
编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。
所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。
这里是重点:
你检查一下你项目的pods里的设置 和你工程的target的设置是否一样
我设置完了以后,项目就好了。。。如果你有什么问题的话,可以留言我们一起探讨一下。。
题外话:
1.$(SRCROOT) / $(PROJECT_DIR) 基本没啥区别,都是指向*.xcodeproj所在的路径
2.$(inherited): target 的Framework Search Paths添加$(inherited)参数会从PROJECT -> Build Settings -> Framework Search Paths里面的路径会被其继承,没有的话不会继承。所以一个项目里面有多个target,使用到了同一个库(Library或Framework)那么为了方便我们可以在target添加继承参数,并且PROJECT统一中添加库的路径。继承的优先级:
Platform defaults
Project file (描述举例用这个优先级,比较常用)
xcconfig file for the Project file
Target
xcconfig file for the Target
3.recursive:遍历该目录,non-recursive:默认路径设置;不遍历该目录。如果路径的属性为recursive,那么编译的时候在找库的路径的时候,会遍历该目录下的所有子目录的库文件。PS:在搭建项目的时候,可以创建一个专门放库文件的文件夹并且设置其属性为recursive。$(PROJECT_DIR)/**相当于遍历项目文件同级下的所有路径(不推荐使用,项目大的话,影响编译的速度)。
4.解决警告“ld: warning: directory not found for option”
从项目中删除了某个目录、文件以后,编译出现警告信息:
ld: warning: directory not found for option“XXXXXX”
很奇怪,为什么已经从项目中删除了文件和文件夹还是报这个警告呢?
去掉警告的办法如下:
1)选择工程, 编译的 (targets)
2)选择 Build Settings 菜单
3)查找 Library Search Paths 和 Framework Search Paths, 删掉编译报warning的路径即OK
总结:
在开发中不遇到这些问题,很难去注意。第一篇简书。爬坡阶段,希望能坚持下去……