框架的目录结构如下:
fw.framework
Versions
A
fw
Libraries
a.dylib
b.dylib
Current -> A
Libraries -> Versions/Current/Libraries
fw -> Versions/Current/fw
依赖关系:
fw
指向a.dylib
a.dylib
指向b.dylib
a.dylib
和b.dylib
包含安装名称 @rpath/a.dylib
和@rpath/b.dylib
。
fw
的 RPATH 设置为@loader_path/Libraries
,以便找到a.dylib
。
但a.dylib
的 RPATH 设置为@loader_path
,因为它的相关性b.dylib
位于同一目录中。
这会有用吗?在递归链接a.dylib
时,链接是否会使用fw
的 RPATH (而不是b.dylib
的 RPATH
@loader_path
的 RPATH 中的a.dylib
会引用a.dylib
的目录,而不是fw
的目录吗?
答案 0 :(得分:0)
是的,你是对的。
如果你使用otool -l <dylib>
,你会发现(在我的情况下):
Load command 22
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)
@loader_path
将被解析为包含<dylib>
的文件夹的路径,因此每个dylib都会自己@loader_path
。
如上所述,LC_RPATH
表示@rpath_path
在不同的dylib中会有不同的路径,但它不会从另一个继承。
因此,当您加载fw
时,@loader_path
的{{1}}是 dirname ,请加载fw
,a.dylib
{ {1}}是 dirname 。