1
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在里面,它是怎么进去的?

4

1 回答 1

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/本地根目录(/usr/local/bin、/usr/local/lib)仅适用于本地机器的任何特定内容。实际上,通过操作系统分发用户 /usr 提供的软件包和自定义安装使用 /use/local 的情况更多。在大多数情况下,这并不重要。在 Mac 上,Homebrew 包管理器使用 /usr/local 根目录(而 MacPorts 使用 /opt 和 Fink /sw)。

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

于 2013-02-18T10:38:30.623 回答