2

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

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

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

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 的链接不断变化。

4

0 回答 0