无法设置`DYLD_LIBRARY_PATH`时,如何在macOS上可移植地安装ImageMagick?

时间:2019-04-18 22:43:34

标签: macos imagemagick dylib

我正在为macOS(Mojave)开发一个命令行实用程序,该实用程序使用ImageMagick操纵图像。我想以独立应用程序的形式共享它,以便其他人可以直接使用它,而不必安装任何其他dylib或框架。 ImageMagick的Homebrew和MacPorts版本似乎已“硬连接”到Mac的系统目录结构(分别为/usr/local/opt/local),以至于很难(不可能?)放置ImageMagick及其组件。将库委派到便携式应用程序捆绑包中。因此,我改为直接使用ImageMagick website中的发行版。

我按照该页面上的安装说明进行操作,并将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,显然DYLD_LIBRARY_PATH也找不到它的dylib。实际上,看来我什至无法将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 个答案:

答案 0 :(得分:2)

首先,ImageMagick网站上当前的IM版本(版本7.0.8)适用于macOS High Sierra。因此,在Mojave上安装它遇到麻烦并不奇怪。 (但是,FWIW,当前的Homebrew版本(IM 7)和MacPorts(IM 6)可以在Mojave上运行。但是,像您一样,我不知道如何使这些版本对委托的处理真正可移植。) / p>

您无法导出DYLD_LIBRARY_PATH的原因是由于Apple的"System Integrity Protection" (SIP),它已添加到更新版本的macOS(El Capitan及更高版本)中。默认情况下,SIP禁止执行诸如更改env变量DYLD_LIBRARY_PATH之类的操作。尽管it is possible to disable SIP,Apple不建议这样做。

但是,您可以使用magick手动修改install_name_tool及其dylib,以便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.)

这将修改相对于magick命令位置的dylib的路径。只要您保持ImageMagick文件夹的目录结构完整,它现在就应该可以完全移植。

您可以轻松地将这五个install_name_tools命令放入一个小的bash脚本中。我将其留给读者练习。 :)