Изменения 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 постоянно меняется, когда я копирую приложение на другой компьютер.

0 ответов

Другие вопросы по тегам