【问题标题】:changing the path of a dylib using install_name_tool使用 install_name_tool 更改 dylib 的路径
【发布时间】:2012-11-09 19:48:34
【问题描述】:
install_name_tool -change /usr/local/lib/testlib.dylib  "$TARGET_BUILD_DIR"/../../testlib.dylib "$PRODUCT_NAME"

上面有人告诉我,在 xcode 中放入运行脚本会改变动态库的查找路径。然后可以通过在终端窗口中输入以下内容来验证这一点

otool -L /drag/the/executable/here/and/its/filepath/will/show/up/testlib

输出将类似于以下内容

/previous/filepath:
/usr/local/lib/testlib.dylib (compatibility version 1.0.0, current version 1.0.0)
./anothertestlib.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

我的问题是为什么 install_name_tool 命令不起作用?现在不是,但当 testlib 项目是客户端项目的目标依赖项时,它确实如此。现在我刚刚将 .dylib 拖到客户端项目中。查找路径保留在 usr/local/lib 中。

还有,什么是usr/local/lib,为什么系统认为我的dylib在里面,又是怎么进去的?

【问题讨论】:

    标签: xcode4 dylib install-name-tool


    【解决方案1】:

    install_name_tool 通过覆盖路径字符串来工作,因此任何新的都必须与原来的长度相同或更短。

    因为 "/usr/local/lib/testlib.dylib" 有 28 个字符长,而 ""$TARGET_BUILD_DIR"/../../testlib.dylib" 至少有 20 个字符长,如果 $TARGET_BUILD_DIR 变量扩展为 9 个或更多字符的字符串,则替换可能太长而无法使用。

    我说可能是因为您可以将标志 -headerpad_max_install_names 添加到链接器,以便它会在每个路径之后添加填充,这样空间就会存在以允许更长的替换(我相信最多 1,024 个字符)。虽然 install_name_tool 失败了,但它可能没有被使用。

    至于 /usr/local/lib 路径,从技术上讲,/usr(/usr/bin、/usr/lib 等)用于适用于任何机器并且可以安装在网络上的软件,而/usr/local root (/usr/local/bin, /usr/local/lib) 适用于任何特定于本地机器的东西。实际上,通过操作系统分发用户 /usr 提供的软件包和自定义安装使用 /use/local 的情况更多。在大多数情况下,这并不重要。在 Mac 上,Homebrew 包管理器使用 /usr/local 根目录(而 MacPorts 使用 /opt 和 Fink /sw)。

    碰巧的是,无论您最初安装它所做的一切都使用该位置而不是任何其他选项。但只要它知道在哪里寻找任何需要的东西,它或多或少都不是一个有效的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2015-10-27
      • 2016-03-03
      • 1970-01-01
      • 2011-10-12
      • 2021-10-08
      相关资源
      最近更新 更多