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のリンクが変わり続けます。