iOS 关于Bulid Setting中Search Paths
Search Paths三大头:
-
Framework Search Paths 管理导入的.framework的路径
-
Library Search Paths 管理导入的.a的路径
-
Header Search Paths 管理导入的头文件的路径
开发中经常会去配置这三个,那么有几个问题需要搞明白:
-
到底要不要配置?
-
如果要配置,那么要配置的理由是什么?
-
如何配置?
写文章的缘由呢,是最近在重构项目的时候,发现这三个Search Paths下面配置了很多,看着有点烦,查了下资料呢,就全删除了。最后三个配置项都只保留了$(inherited)
和$(PROJECT_DIR)
,如图:
项目运行中,有一个报错,有个.a文件找不到,所以在Library Search Paths
下配置了该.a的路径,项目也是成功的运行了起来。那么问题来了,到底要不要配置这么多选项呢?下面在实际操作中一个个的分析下。
一、Library Search Paths
先删除一条配置项,运行项目,发现有报错无法运行,提示如下:
ld: library not found for -lzwlibIos
clang: error: linker command failed with exit code 1 (use -v to see invocation)
说明此.a库没有找到,看来不得不配置,这里只需要配置工程内的.a路径即可。有设置过$(inherited)
,就不需要配置cocoapods管理的路径。
由此可见,项目内有.a文件(pods除外),就必须要配置Library Search Paths
。如果没有至少设置一个$(inherited)
,反正没啥影响。
二、Framework Search Paths
同样的方法删除一条配置项,运行项目,发现有报错无法运行,提示如下:
ld: framework not found EquesBusiness
clang: error: linker command failed with exit code 1 (use -v to see invocation)
说明此.framework没有找到,看来不得不配置,同样这里只需要配置工程内的.framework路径即可。有设置过$(inherited)
,就不需要配置cocoapods管理的路径。
由此可见,项目内有.framework文件(pods除外),就必须要配置Framework Search Paths
。如果没有至少设置一个$(inherited)
,反正没啥影响。
三、Header Search Paths
同样的方法删除一条配置项,运行项目,发现有报错无法运行,这一次报错的位置和前两个不一样,这个报错发生在头文件导入的时候,如图:
提示内容:
'***.framework/Headers/***.h' file not found
这是#import
引入的问题,修改引入方式即可:
// 旧的引入方式
#import "EquesBusiness.framework/Headers/YKBusinessFramework.h"
// 新的引入方式
#import <EquesBusiness/YKBusinessFramework.h>
随后项目也是成功运行,这里先看一下这个framework的结构。可以看到新旧引入方式不同的地方:
-
#import ""
变成了#import <>
-
少了Headers和.framework
这个地方我突然想试试,在Header Search Paths
重新添加这个framework路径,还是使用新的引入方式,看看有什么问题,结果也是很满意,项目成功运行。
总结一下:
-
通过
#import ""
引入,必须要在Header Search Paths
中添加framework的路径。并且引入的要明确路径(上面的headers)。 -
通过
#import <>
引入,Header Search Paths
配置与否无所谓,也不需要关心.h在framework中的路径,直接<framework名/要引入的头文件.h>
即可。
可见,在引入framework头文件时最好使用#import <>
引入。省去配置的同时,也算是对编码的规范,更好的区分文件属性。
四、最后
有兴趣你也可以了解下non-recursive
、recursive
和$(inherited)
。方便你更好的配置Search Paths。至于选择non-recursive
还是recursive
,搜了下大家都说non-recursive
最终会转变成recursive
,所以还是按系统默认的non-recursive
设置即可。
至于路径到底使用$(SRCROOT)
、$(PROJECT_DIR)
还是别的,我都是直接拖进去自动生成的,这么方便就能解决的问题不用那么麻烦。