Xcode4 使用install\u name\u工具更改动态库的路径

Xcode4 使用install\u name\u工具更改动态库的路径,xcode4,dylib,install-name-tool,Xcode4,Dylib,Install Name Tool,上面告诉我,当在xcode中放入运行脚本时,会更改动态库的查找路径。然后可以通过在终端窗口中输入以下内容来验证 install_name_tool -change /usr/local/lib/testlib.dylib "$TARGET_BUILD_DIR"/../../testlib.dylib "$PRODUCT_NAME" 输出如下所示 otool -L /drag/the/executable/here/and/its/filepath/will/show/up/testlib

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

install_name_tool -change /usr/local/lib/testlib.dylib  "$TARGET_BUILD_DIR"/../../testlib.dylib "$PRODUCT_NAME"
输出如下所示

otool -L /drag/the/executable/here/and/its/filepath/will/show/up/testlib
我的问题是为什么install\u name\u tool命令不起作用?现在不是这样,但当testlib项目是客户机项目的目标依赖性时,它就这样做了。现在,我刚刚将.dylib拖到客户机项目中。查找路径保持在usr/local/lib中


还有,什么是usr/local/lib,为什么系统认为我的动态库在那里,它是如何进入那里的?

install\u name\u工具通过覆盖路径字符串来工作,因此任何新的路径字符串都必须与原始路径字符串长度相同或更短

因为“/usr/local/lib/testlib.dylib”的长度为28个字符,“$TARGET\u BUILD\u DIR”/.././testlib.dylib”的长度至少为20个字符,如果$TARGET\u BUILD\u DIR变量扩展为9个或更多字符的字符串,则替换内容可能太长而无法使用

我之所以这么说,可能是因为您可以向链接器中添加标志-headerpad_max_install_name,这样它就可以在每个路径后面添加填充,这样空间就可以存在,以允许更长的替换(我相信最多1024个字符)。虽然安装工具失败,但可能没有使用

至于/usr/local/lib路径,从技术上讲,/usr(/usr/bin,/usr/lib等)用于应用于任何机器并且可以安装在网络上的软件,而/usr/local root(/usr/local/bin,/usr/local/lib)则用于特定于本地机器的任何东西。实际上,更多的情况是通过OS发行版users/usr和custom installs提供的包使用/use/local。在大多数情况下,这并不重要。在Mac上,Homebrew软件包管理器使用/usr/local root(而MacPorts使用/opt和Fink/sw)


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

install\u name\u工具通过覆盖路径字符串来工作,因此任何新的路径字符串都必须与原始路径字符串长度相同或更短

因为“/usr/local/lib/testlib.dylib”的长度为28个字符,“$TARGET\u BUILD\u DIR”/.././testlib.dylib”的长度至少为20个字符,如果$TARGET\u BUILD\u DIR变量扩展为9个或更多字符的字符串,则替换内容可能太长而无法使用

我之所以这么说,可能是因为您可以向链接器中添加标志-headerpad_max_install_name,这样它就可以在每个路径后面添加填充,这样空间就可以存在,以允许更长的替换(我相信最多1024个字符)。虽然安装工具失败,但可能没有使用

至于/usr/local/lib路径,从技术上讲,/usr(/usr/bin,/usr/lib等)用于应用于任何机器并且可以安装在网络上的软件,而/usr/local root(/usr/local/bin,/usr/local/lib)则用于特定于本地机器的任何东西。实际上,更多的情况是通过OS发行版users/usr和custom installs提供的包使用/use/local。在大多数情况下,这并不重要。在Mac上,Homebrew软件包管理器使用/usr/local root(而MacPorts使用/opt和Fink/sw)

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

/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)