2

py2appを使用してPythonGUIをアプリケーションにラップしています。別のマシンに移植すると、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のリンクが変わり続けます。

4

0 に答える 0