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路径,还是使用新的引入方式,看看有什么问题,结果也是很满意,项目成功运行。

总结一下

  1. 通过#import ""引入,必须要在Header Search Paths中添加framework的路径。并且引入的要明确路径(上面的headers)。

  2. 通过#import <>引入,Header Search Paths配置与否无所谓,也不需要关心.h在framework中的路径,直接<framework名/要引入的头文件.h>即可。

可见,在引入framework头文件时最好使用#import <>引入。省去配置的同时,也算是对编码的规范,更好的区分文件属性。

四、最后

有兴趣你也可以了解下non-recursiverecursive$(inherited)。方便你更好的配置Search Paths。至于选择non-recursive还是recursive,搜了下大家都说non-recursive最终会转变成recursive,所以还是按系统默认的non-recursive设置即可。

至于路径到底使用$(SRCROOT)$(PROJECT_DIR)还是别的,我都是直接拖进去自动生成的,这么方便就能解决的问题不用那么麻烦。

猜你喜欢

转载自blog.csdn.net/king6188/article/details/131314653