Можно ли скомпилировать статическую / переносную версию ImageMagick для High Sierra / Mojave? - PullRequest
2 голосов
/ 26 июня 2019

Этот вопрос уже задавался 4 года назад, поэтому часть High Sierra / Mojave является новой.Вот ссылка на оставшийся без ответа вопрос: скомпилировать статическую версию утилиты imagemagick convert

Я пытаюсь скомпилировать переносную версию IM, которую я могу включить в скрипт, который можно использовать в другихМашины MacOS, без необходимости сначала устанавливать на машину инструменты разработчика или порты Mac.Я вижу, что ImageMagick.org предоставляет статические и переносимые сборки для Windows, но предоставляет только скомпилированный двоичный файл для OS X / Darwin.

Когда я пытаюсь запустить предварительно скомпилированную версию на Mac с новой установкой Mojave, я получаю следующее:

dyld: Library not loaded: /ImageMagick-7.0.8/lib/libMagickCore-7.Q16HDRI.6.dylib
  Referenced from: /Users/chrisnorman/Desktop/ImageMagick-7.0.8/bin/./magick
  Reason: image not found

Когда я запускаю otool (для этого требовалось установить командную строкуинструменты разработчика) против предварительно скомпилированного двоичного файла от magick я получаю следующее:

otool -L magick
magick:
    /ImageMagick-7.0.8/lib/libMagickCore-7.Q16HDRI.6.dylib (compatibility version 7.0.0, current version 7.0.0)
    /ImageMagick-7.0.8/lib/libMagickWand-7.Q16HDRI.6.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.5)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)

, который является более коротким списком, чем я получил, когда пытался использовать двоичный файл, скомпилированный на другом Mac, и запустить на немсвежая установка Мохаве Mac.

Мне бы хотелось получить руководство по компиляции версии, аналогичной переносимой версии IM, которую они предварительно скомпилировали для Windows, на странице загрузок ImageMagick.Что-то, что я могу просто добавить на любой Mac и запустить на нем, не беспокоясь о том, что на компьютере уже установлено несколько динамических библиотек.

Вот мой текущий установочный скрипт для попытки создания IM на Mac, на котором уже есть Xcode:

#!/bin/bash

set -e

IMBUILD=/tmp/imbuild/
mkdir -p $IMBUILD/bin

# get IM (Version 7 at the moment)
mkdir im_download && cd im_download
curl -O http://www.imagemagick.org/download/ImageMagick.tar.gz
for file in *.gz ; do tar zxf $file; done
rm *.tar.gz
cd ImageM*

# get delegates
# jpeg
echo ">>>>>>>>>>>>>> JPEG"
curl -O http://www.imagemagick.org/download/delegates/jpegsrc.v9b.tar.gz
tar zxf jpeg*.gz && rm jpeg*.gz && mv jpeg* jpeg && cd jpeg
./configure --disable-shared --disable-dependency-tracking
make
cd ..

# png
echo ">>>>>>>>>>>>>> PNG"
curl -O http://www.imagemagick.org/download/delegates/libpng-1.6.31.tar.gz
tar zxf libpng*.gz && rm libpng*.gz && mv libpng* png && cd png
./configure --disable-shared --disable-dependency-tracking
make
cd ..

# lcms
echo ">>>>>>>>>>>>>> LCMS"
curl -O http://www.imagemagick.org/download/delegates/lcms2-2.8.tar.gz
tar zxf lcms2*.gz && rm lcms2*.gz && mv lcms2* lcms && cd lcms
./configure --disable-shared --disable-dependency-tracking
make
cd ..

# tiff
echo ">>>>>>>>>>>>>> TIFF"
curl -O http://www.imagemagick.org/download/delegates/tiff-4.0.8.tar.gz
tar zxf tiff*.gz && rm tiff*.gz && mv tiff* tiff && cd tiff
./configure --disable-shared --disable-dependency-tracking
make
cd ..

#build imagemagick (YMMV)
echo ">>>>>>>>>>>>>> IMAGEMAGICK"
./configure --disable-shared \
    --disable-dependency-tracking \
    --disable-shared \
    --enable-osx-universal-build \
    --enable-delegate-build \
    --enable-static \
    --disable-installed \
    --without-frozenpaths \
    --prefix=$IMBUILD \
    --with-openexr=no \
    --disable-docs \
    --with-lcms=yes \
    --without-x \
    --without-webp \
    --without-modules \
    --with-zero-configuration \
    --with-jpeg \
    --without-pango \
    --enable-hdri=no \
    --without-gvc \
    --with-raw

make install

ls $IMBUILD/bin

Приведенная выше конфигурация - то, что я собираюсь, так что мне нужнобольшинство из них - JPEG, TIFF и LCMS.

Так что любые указатели или советы о том, что мне нужно добавить в этот скрипт, чтобы получить действительно портативную версию IM, были бы фантастическими!

1 Ответ

0 голосов
/ 26 июня 2019

Я не специалист по этому вопросу, но я где-то читал, что компоновщик Apple всегда предпочитает динамические библиотеки статическим, то есть он выбирает библиотеки, заканчивающиеся на .dylib, в отличие от библиотек, заканчивающихся на .a.

Итак, я скопировал ваш скрипт оболочки и отредактировал его для сборки ImageMagick с очень небольшим количеством включенных опций, чтобы сократить время настройки / сборки. Тогда я перебрал варианты.

Я не проводил исчерпывающего тестирования, и у меня нет запасного чистого Mac без моего любимого ImageMagick. Однако я построил ImageMagick и проверил зависимости с помощью:

otool -L ./magick

./magick:
    /usr/local/opt/libpng/lib/libpng16.16.dylib (compatibility version 54.0.0, current version 54.0.0)
    /usr/local/opt/fftw/lib/libfftw3.3.dylib (compatibility version 9.0.0, current version 9.8.0)
    /usr/local/opt/fontconfig/lib/libfontconfig.1.dylib (compatibility version 14.0.0, current version 14.0.0)
    /usr/local/opt/freetype/lib/libfreetype.6.dylib (compatibility version 24.0.0, current version 24.0.0)
    /usr/local/opt/xz/lib/liblzma.5.dylib (compatibility version 8.0.0, current version 8.4.0)
    /usr/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.5)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)

Затем я обнаружил, что если я временно переименую динамическую библиотеку libpng и перестрою (после использования make distclean), то зависимость исчезнет.

Поэтому я предполагаю (угадаю / надеюсь), что если вы удалите (или, может быть, лучше переименовать) динамические библиотеки во всех ваших делегатах, они будут статически связываться, и вы можете получить что-то распространяемое.

Например, вот как я принудительно libjpeg установил статическую ссылку. Поскольку мой установлен через homebrew , я нахожу динамическую библиотеку, например:

brew ls --verbose jpeg | grep dylib

И это говорит мне, что это здесь:

/usr/local/Cellar/jpeg/9c/lib/libjpeg.dylib

Итак, я иду туда и прячу это от компоновщика:

cd /usr/local/Cellar/jpeg/9c/lib
mv libjpeg.dylib HIDDENlibjpeg.dylibHIDDEN

Вот скрипт, который я использовал:

#!/bin/bash
################################################################################
# macBuildPortableMagick
# Mark Setchell
#
# Build PORTABLE ImageMagick from source and install under my user without 
# clashing with any system derived packages.
################################################################################
INSTALLDIR=$HOME/ImageMagick
BUILDDIR=$HOME/ImageMagick/ImageMagick

# Create the installation directory
mkdir -p "$INSTALLDIR"

# Go to the distribution, clean, build and install
cd "$BUILDDIR"
if [ $? -ne 0 ] ; then 
   >&2 echo ERROR: Unable to change directory to $BUILDDIR
   exit 1
fi

make distclean

./configure \
   CC=clang \
   CFLAGS="-O3" \
   CXX=clang++ \
   CXXFLAGS="-std=c++11 -O3 -march=native"  \
   --disable-dependency-tracking \
   --without-x \
   --without-magick-plus-plus \
   --disable-shared \
   --enable-static \
   --with-quantum-depth=16 \
   --enable-hdri=no \
   --prefix="$INSTALLDIR" \
   --disable-docs \
   --disable-osx-universal-binary \
   --disable-silent-rules \
   --enable-zero-configuration \
   --with-jpeg \
   --with-heic=no \
   --with-lcms=no \
   --with-openexr=no \
   --with-openjp2=no \
   --with-tiff=no \
   --with-xml=no \
   --with-webp=no

# I prefer to check things before copying and pasting the next bit
exit
make -j 8 && make install

Если кто-то знает об этом больше и может добавить некоторые идеи - пожалуйста, дайте мне знать через комментарии или путем редактирования и добавления нового абзаца в конце ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...