#import 引入头文件 有两种方式
-
< >
:是只从 Header Search Paths 中搜索;是从系统目录空间 (对应 Header Search Paths)中搜索文件 -
" "
:能从 Header Search Paths 和 User Header Search Paths 中搜索;从用户目录空间(对应 User Header Search Paths)中搜索文件
换言之 ,假如你把 路径加到 User Header Search Paths 中,那么你用 #import <file.h> 的方式去引入对应的头文件,就会报错。 如果加到 Header Search Paths, 就没有问题了。
所以在修改文件路径这个选项的时候使用
"$(SRCROOT)/当前工程名字/需要包含头文件所在文件夹"
将上面的双引号里面的字符串拷贝之后,你会发现这个$(SRCROOT)
,会自动变成当前工程所以的目录。
这样就可以了,发给别人,别人也不用再去修改路径了。
绝对路径: 点击工程某个文件,右键“show in finder”打开终端,cd 把文件夹拖入,即可出现一个路径,这个就是绝对路径.
相对路径: 相对于当前工程文件的路径,./
表示当前工程文件夹,,../
表示上层目录 ,在xcode里$(PROJECT_DIR)
也表示当前工程文件夹目录
这里还要了解一下在iOS中怎么代表相对路径和绝对路劲
$(SRCROOT)
代表的是项目根目录下$(PROJECT_DIR)
代表的是整个项目./
也表示当前工程文件夹../
表示上层目录
⚠️⚠️⚠️⚠️⚠️⚠️:以上相对路径后面拼接的必须是项目中真实文件夹名,工程内部的group
无效!
当导入的静态库使用了类别,其他链接标签设需要设为
-ObjC
Build Settings 变量解读
@executable_path
这个变量表示可执行程序所在的目录.
@loader_path
这个变量表示每一个被加载的 binary (包括App, dylib, framework,plugin等) 所在的目录.
在一个程序中, 对于每一个模块, @loader_path
会解析成不用的路径, 而 @executable_path
总是被解析为同一个路径(可执行程序所在目录). 比如一个会被多个程序调用的 plugin, 位于/path/Flash Player.plugin/Contents/MacOS/Flash Playe
r, 依赖 /path/Flash Player.plugin/Contents/Frameworks/XPSSO.dylib
那么 XPSSO.dylib
的 INSTALL_PATH
可以设置为 @loader_path/../Frameworks
, 这样设置的话, 不论 Flash Player.plugin
目录放到什么位置, XPSSO.dylib
都能正确的被加载.
@rpath
和前面两个不同, 它只是一个保存着一个或多个路径的变量. 比如 XPSSO.dylib
被两个 .app
使用, 且被包含的路径不同。比如:softA.app/Contents/MacOS/dylib/XPSSO.dylib
softB.app/Contents/MacOS/Frameworks/XPSSO.dylib
将 XPSSO.dylib 的 INSTALL_PATH 设置成 @loader_path/../dylib
或 @loader_path/../Frameworks
都只能满足其中一个 .app 的需求. 要解决这个问题, 就可以用 @rpath
将 XPSSO.dylib 的 INSTALL_PATH 设置成 @rpath
, 然后在编译 softA.app, softB.app 时分别指定 @rpath 为 @loader_path/../dylib
, @loader_path/../Frameworks
, 问题得到了解决.
@rpath
的另一个优点是可以设置多个路径. 如果 softA.app 还需要使用另一个 .plugin (假设它的 INSTALL_PATH 也设置成了 @rpath), 位于 @loader_path/../plugin
, 把这个路径加到 @rpath
即可.
XPSSO.dylib的Build Settings
中设置Installation Directory
在 softA.app或softB.app 中设置 Runpath Search Paths
(对应了@rpath
)
网友评论