在iOS的工程中,尤其是在使用CocoaPods前,经常会把某个静态库或者Framework直接拖到工程中,编译运行通过,这样就可以了么?
一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这时候绝对路径的缺点立马出现。
Xcode用户可以 通过Header Search Paths 来配置环境变量。但这里涉及到一个另外一个参数 User 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 <file.h> 的方式去引入对应的头文件,就会报错。 如果加到 Header Search Paths, 就没有问题了。
具体一点的区别是,<> 是从系统目录空间 (对应 Header Search Paths)中搜索文件, "" 是从用户目录空间(对应 User Header Search Paths)中搜索文件。 如果你把路径加到 User Header Search Paths 中,却使用 <>导入头文件,那么程序无法从系统目录空间中找到新加的路径,从而报错。
所以在修改User Header Search Paths这个选项的时候使用
"$(SRCROOT)/当前工程名字/需要包含头文件所在文件夹"
将上面的双引号里面的字符串拷贝之后,你会发现这个“$(SRCROOT)”,会自动变成当前工程所以的目录。
这样就可以了,发给别人,别人也不用再去修改路径了。
绝对路径: 点击工程某个文件,右键“show in finder”打开终端,cd 把文件夹拖入,即可出现一个路径,这个就是绝对路径.
相对路径: 相对于当前工程文件的路径,“./”表示当前工程文件夹,,"../"表示上层目录 ,在xcode里“$(PROJECT_DIR)”也表示当前工程文件夹目录
这里还要了解一下在iOS中怎么代表相对路径和绝对路劲
$(SRCROOT)代表的是项目根目录下
$(PROJECT_DIR)代表的是整个项目
./也表示当前工程文件夹
../表示上层目录
以上相对路径后面拼接的必须是项目中真实文件夹名,工程内部的group无效!
1.c/c++ 头文件引用问题
include/import <> 引用编译器的类库路径下的头文件
include/import “” 引用工程目录的相对路径的头文件
include/import 都是编译指令,在编译时,编译器会将相对路径替换成绝对路径。因此,头文件的绝对路径=搜索路径+相对路径。
Xcode Build Settings 中的 Header Search Paths: 即可设置头文件搜索路径。
例如:文件test.h的路径为testDemo/libs/test.h,我们在Xcode的
Header Search Paths中添加$(SRCROOT),那么项目中引用该文件的写法为#import "libs/test.h"
如果在Header Search Paths中添加$(SRCROOT)/libs, 那么项目中引用该文件的写法为#import "test.h"
2. Other Linker Flags:“-ObjC”
当导入的静态库使用了类别,其他链接标签设需要设为-ObjC