install_name_tool更改不会在分发上传播

时间:2012-08-13 20:04:02

标签: xcode macos dynamic-linking dylib install-name-tool

我使用py2app将python GUI包装到应用程序中。在移植到另一台机器时,我注意到我的libpng12.0.dylib存在依赖性问题。这是由系统提供的,使用X11存储,因此传统上不是由py2app捆绑的。

另一个dylib(捆绑)需要更新版本的libpng。使用下面的命令,我试图链接到我将包含在OS X中的libpng副本。这在本地非常有效,但是当我尝试复制应用程序时,它将恢复到旧路径。以下命令可以更好地解释这一点。

将我的libpng复制到我的应用程序的Framework目录。

cp /usr/X11/lib/libpng12.0.dylib dist/PyStretch.app/Contents/Frameworks/

查看libgdal.1.dylib依赖的路径(需要更新的libpng)

   mbp:pystretch drferling$ otool -L   
   dist/PyStretch.app/Contents/MacOS/../Frameworks/libgdal.1.dylib 
   dist/PyStretch.app/Contents/MacOS/../Frameworks/libgdal.1.dylib:
   @executable_path/../Frameworks/libgdal.1.dylib (compatibility version 18.0.0, current version 18.1.0)
    ...CLIPPED
    /usr/X11/lib/libpng12.0.dylib (compatibility version 47.0.0, current version 47.0.0)
    @executable_path/../Frameworks/libcfitsio.dylib (compatibility version 0.0.0, current version 0.0.0)

所以libpng链接到系统安装。我们需要将其更改为链接到本地​​(到应用程序)安装。

install_name_tool -change /usr/X11/lib/libpng12.0.dylib @executable_path/../Frameworks/libpng12.0.dylib dist/PyStretch.app/Contents/MacOS/../Frameworks/libgdal.1.dylib

然后我们需要验证这是否有效。

mbp:pystretch drferling$ otool -L 
dist/PyStretch.app/Contents/MacOS/../Frameworks/libgdal.1.dylib dist/PyStretch.app/Contents/MacOS/../Frameworks/libgdal.1.dylib:
@executable_path/../Frameworks/libgdal.1.dylib (compatibility version 18.0.0, current version 18.1.0)
...CLIPPED
@executable_path/../Frameworks/libpng12.0.dylib (compatibility version 47.0.0, current version 47.0.0)
@executable_path/../Frameworks/libcfitsio.dylib (compatibility version 0.0.0, current version 0.0.0)

所以它奏效了。 libpng现在链接到包含的副本,而不是系统副本。

然后我将应用程序复制到另一台机器进行测试,libpng恢复为静态链接到libpng的系统安装!

为什么?

我也尝试使用install_tool_name -id,但结果是一样的。当我将应用程序复制到另一台机器时,我的dylib链接不断变化。

0 个答案:

没有答案