我使用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链接不断变化。