macOS 中的递归 RPATH

Recursive RPATH in macOS

一个框架的目录结构是这样的:

   fw.framework
      Versions
         A
            fw
            Libraries
               a.dylib
               b.dylib
         Current -> A
      Libraries -> Versions/Current/Libraries
      fw -> Versions/Current/fw

依赖关系:

a.dylibb.dylib 具有 安装名称 @rpath/a.dylib@rpath/b.dylib.

fwRPATH设置为@loader_path/Libraries,这样可以找到a.dylib.

但是a.dylibRPATH设置为@loader_path,因为它的依赖b.dylib在同一个目录下

这行得通吗?当递归链接 b.dylib 时,链接器是否会使用 a.dylibRPATH(而不是 fw 中的一个)

并且 a.dylibRPATH 中的 @loader_path 会引用 a.dylib 的目录,而不是 [=11= 的目录]?

是的,你是对的。

如果你使用 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 时,fw@loader_path 是它的 dirname,加载 a.dylib,[= a.dylib 的 12=] 是它的 dirname.