当我无法设置“DYLD_LIBRARY_PATH”时,如何在 macOS 上便携式安装 ImageMagick?

2023-12-30

我正在为 macOS (Mojave) 开发一个命令行实用程序,它使用 ImageMagick 来操作图像。我想将它作为一个独立的应用程序进行共享,以便其他人可以开箱即用,而无需安装任何额外的 dylib 或框架。 ImageMagick 的 Homebrew 和 MacPorts 版本似乎与 Mac 的系统目录结构“硬连线”(/usr/local and /opt/local分别)以这样的方式很难(不可能?)将 ImageMagick 及其委托库放入可移植的应用程序包中。所以我直接使用来自ImageMagick 网站 https://www.imagemagick.org/script/download.php#macosx.

我按照该页面上的安装说明进行操作,并将 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
$

Clearly 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 变得便携?


首先,目前ImageMagick网站上的IM版本(版本7.0.8)适用于macOS High Sierra。因此,您在 Mojave 上安装它时遇到问题也就不足为奇了。 (FWIW,当前的 Homebrew 版本(IM 7)和 MacPorts(IM 6)确实可以在 Mojave 上运行。但是,像您一样,我不知道如何使这些版本对代表的处理真正可移植。)

无法导出的原因DYLD_LIBRARY_PATH是因为苹果的“系统完整性保护”(SIP) https://support.apple.com/en-us/HT204899,它已添加到较新版本的 macOS(El Capitan 及更高版本)中。默认情况下,SIP 禁止执行诸如更改环境变量之类的操作DYLD_LIBRARY_PATH。虽然可以禁用 SIP https://apple.stackexchange.com/questions/208478/how-do-i-disable-system-integrity-protection-sip-aka-rootless-on-macos-os-x,苹果不建议这样做。

但是,您可以修改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.)

这会修改 dylib 相对于magick命令。只要保持 ImageMagick 文件夹的目录结构完整,它现在应该是完全可移植的。

您可以轻松地将这五个install_name_tools命令变成一点bash脚本。我将把它作为练习留给读者。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我无法设置“DYLD_LIBRARY_PATH”时,如何在 macOS 上便携式安装 ImageMagick? 的相关文章

随机推荐