Я не специалист по этому вопросу, но я где-то читал, что компоновщик 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
Если кто-то знает об этом больше и может добавить некоторые идеи - пожалуйста, дайте мне знать через комментарии или путем редактирования и добавления нового абзаца в конце ответа.