簡體   English   中英

無法設置`DYLD_LIBRARY_PATH`時,如何在macOS上可移植地安裝ImageMagick?

[英]How to install ImageMagick portably on macOS when I can't set `DYLD_LIBRARY_PATH`?

我正在為macOS(Mojave)開發命令行實用程序,該實用程序使用ImageMagick來處理圖像。 我想以獨立應用程序的形式共享它,以便其他人可以直接使用它,而不必安裝任何其他dylib或框架。 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
$

顯然,即使我按照指示設置了DYLD_LIBRARY_PATHmagick也沒有找到它的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便攜式?

首先,ImageMagick網站上當前的IM版本(版本7.0.8)適用於macOS High Sierra。 因此,在Mojave上安裝它遇到麻煩並不奇怪。 (FWIW,當前的Homebrew版本(IM 7)和MacPorts(IM 6)可以在Mojave上運行。但是,像您一樣,我不知道如何使這些版本對委托的處理真正可移植。)

您無法導出DYLD_LIBRARY_PATH的原因是由於Apple的“系統完整性保護”(SIP) ,它已將其添加到更新的macOS版本(El Capitan及更高版本)中。 默認情況下,SIP禁止執行諸如更改環境變量DYLD_LIBRARY_PATH 盡管可以禁用SIP ,但Apple不建議這樣做。

但是,您可以使用install_name_tool手動修改magick及其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腳本中。 我將其留給讀者練習。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM