框架的目录结构如下所示:
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的RPATH (而不是fw的RPATH,当递归地链接b.dylib时)
@loader_path在a.dylib的RPATH中会引用a.dylib的目录,而不是fw的目录吗?
发布于 2017-12-31 19:08:18
是的,你是对的。
如果使用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中有不同的路径,它不会从另一个dylib继承。
因此,当您加载fw时,@loader_path of fw是它的目录名,load a.dylib,@loader_path of a.dylib是它的目录名E 216。
https://stackoverflow.com/questions/46560075
复制相似问题