Как установить ImageMagick переносимо на macOS, если я не могу установить `DYLD_LIBRARY_PATH`? - PullRequest
0 голосов
/ 19 апреля 2019

Я разрабатываю утилиту командной строки для macOS (Mojave), которая управляет изображениями с помощью ImageMagick.Я хочу поделиться им как автономным приложением таким образом, чтобы другие могли использовать его «из коробки» без необходимости устанавливать какие-либо дополнительные библиотеки или фреймворки.Версии ImageMagick для Homebrew и MacPorts, похоже, «привязаны» к структуре системных каталогов Mac (/usr/local и /opt/local соответственно) таким образом, что трудно (невозможно?) Поместить ImageMagick и его библиотеки делегатов впортативный комплект приложений.Поэтому вместо этого я использую дистрибутив непосредственно с веб-сайта ImageMagick .

. Я следовал инструкциям по установке на этой странице и поместил папку ImageMagick в свой домашний каталог (на ~myname).По инструкции я сделал export DYLD_LIBRARY_PATH="/Users/myname/ImageMagick-7.0.8/lib/".Но когда я запускаю magick, я получаю сообщение об ошибке:

$ ~myname/ImageMagick-7.0.8/bin/magick logo: test.jpg
dyld: Library not loaded: /ImageMagick-7.0.8/lib/libMagickCore-7.Q16HDRI.6.dylib
  Referenced from: /Users/myname/ImageMagick-7.0.8/bin/magick
  Reason: image not found
Abort trap: 6
$

Очевидно, что magick не находит его dylibs, даже когда я установил DYLD_LIBRARY_PATH в соответствии с инструкциями.Похоже, на самом деле я даже не могу экспортировать DYLD_LIBRARY_PATH в окружающую среду:

$ export MAGICK_HOME="/Users/myname/ImageMagick-7.0.8"
$ export DYLD_LIBRARY_PATH="$MAGICK_HOME/lib/"
$ echo $DYLD_LIBRARY_PATH
/Users/myname/ImageMagick-7.0.8/lib
$ printenv | grep DYLD_LIBRARY_PATH
   # (nothing)
$ printenv | grep ImageMagick
MAGICK_HOME=/Users/myname/ImageMagick-7.0.8
$ 

Что происходит?Как я могу сделать ImageMagick портативным?

1 Ответ

2 голосов
/ 19 апреля 2019

Прежде всего, версия IM, которая в настоящее время находится на веб-сайте ImageMagick (версия 7.0.8), предназначена для MacOS High Sierra. Поэтому неудивительно, что у вас возникли проблемы с установкой на Мохаве. (Однако FWIW, текущая версия Homebrew (IM 7) и MacPorts (IM 6) работают на Mojave. Но, как и вы, я не знаю, как сделать обработку этих версий делегатами действительно переносимой.)

Причина, по которой вы не можете экспортировать DYLD_LIBRARY_PATH, заключается в том, что Apple «Защита целостности системы» (SIP) добавила ее в более новые версии macOS (El Capitan и более поздние версии). По умолчанию SIP запрещает делать такие вещи, как изменение переменной env DYLD_LIBRARY_PATH. Хотя можно отключить SIP , Apple не рекомендует делать это.

Однако вы можете изменить magick и его dylibs вручную, используя install_name_tool, чтобы IM 7.0.8 нормально работал на Mojave. Вот как (в bash):

# magick: set the correct path to libMagickCore.dylib 
install_name_tool -change \
    /ImageMagick-7.0.8/lib/libMagickCore-7.Q16HDRI.6.dylib \
    @executable_path/../lib/libMagickCore-7.Q16HDRI.6.dylib \
    /Users/myname/ImageMagick-7.0.8/bin/magick

# magick: set the correct path to libMagickWand.dylib 
install_name_tool -change \
    /ImageMagick-7.0.8/lib/libMagickWand-7.Q16HDRI.6.dylib \
    @executable_path/../lib/libMagickWand-7.Q16HDRI.6.dylib \
    /Users/myname/ImageMagick-7.0.8/bin/magick

# libMagickWand.dylib: set the correct ID
install_name_tool -id \
    @executable_path/../lib/libMagickWand-7.Q16HDRI.6.dylib \
    /Users/myname/ImageMagick-7.0.8/lib/libMagickWand-7.Q16HDRI.6.dylib

# libMagickWand.dylib: set the correct path
install_name_tool -change \
    /ImageMagick-7.0.8/lib/libMagickCore-7.Q16HDRI.6.dylib \
    @executable_path/../lib/libMagickCore-7.Q16HDRI.6.dylib \
    /Users/myname/ImageMagick-7.0.8/lib/libMagickWand-7.Q16HDRI.6.dylib

# libMagickCore.dylib: set the correct ID
install_name_tool -id \
    @executable_path/../lib/libMagickCore-7.Q16HDRI.6.dylib \
    /Users/myname/ImageMagick-7.0.8/lib/libMagickCore-7.Q16HDRI.6.dylib

Теперь это работает:

$ /Users/myname/ImageMagick-7.0.8/bin/magick logo: test.jpg
$ open test.jpg
$ # (Preview opens a nice picture of the ImageMagick logo.)

Это изменяет пути к dylibs относительно местоположения команды magick. Пока вы сохраняете структуру каталогов папки ImageMagick без изменений, она теперь должна быть полностью переносимой.

Вы можете легко поместить эти пять install_name_tools команд в небольшой bash скрипт. Я оставлю это как упражнение для читателя. :)

...