Изменения install_name_tool не распространяются при распространении
Я оборачиваю Python GUI в приложение, используя py2app. При портировании на другую машину я заметил, что у меня возникла проблема с зависимостью от libpng12.0.dylib. Это хранится в системе, вместе с X11, и, следовательно, традиционно не связано с py2app.
Другой dylib (который входит в комплект) требует более новой версии libpng. Используя приведенные ниже команды, я попытался создать ссылку на копию libpng, которую я включу в OS X. Это прекрасно работает локально, но когда я пытаюсь скопировать приложение, оно возвращается к старому пути. Команды ниже должны объяснить это лучше.
Скопируйте мой 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 постоянно меняется, когда я копирую приложение на другой компьютер.