我正在为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便携式?
答案 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
脚本中。我将其留给读者练习。 :)