macOS中的递归RPATH

问题描述 投票:2回答:1

框架的目录结构如下:

   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.dylibb.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之一,递归链接b.dylib

@loader_path的RPATH中的a.dylib是否会引用a.dylib的目录,而不是fw的目录?

macos linker dynamic-linking rpath
1个回答
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_pathfw是它的dirname,加载a.dylib@loader_patha.dylib是它的dirname。

© www.soinside.com 2019 - 2024. All rights reserved.