这个问题在4年前就已经问过了,所以High Sierra / Mojave部分是新的。这是未回答问题的链接: compile static version of imagemagick convert util
我正在尝试编译IM的便携式版本,可以将其包含在可以在其他MacOS计算机上使用的脚本中,而无需首先在计算机上安装开发人员工具或Mac Ports。我看到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
针对预编译的二进制ot magick运行otool(这需要安装命令行开发人员工具)时,我得到以下信息:
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上编译并在全新的Mojave Mac上运行的二进制文件时得到的列表要短。
我只想提供一些指南,以指导他们如何在ImageMagick的下载页面上编译与他们为Windows预编译的IM的便携式版本相似的版本。我可以随便在任何Mac上运行的东西,而不必担心计算机上是否已经安装了一堆动态库。
这是我当前的安装脚本,用于尝试在已装有Xcode的Mac上构建IM:
#!/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版本,我需要在脚本中添加任何提示或技巧,都是很棒的选择!
答案 0 :(得分:0)
我不是这方面的专家,但是我读到某个地方,苹果链接器总是更喜欢动态库而不是静态库,即,它选择以.dylib
结尾的库,而不是以.a
结尾的库。 / p>
因此,我复制了您的Shell脚本并对其进行了编辑,以构建ImageMagick并启用了很少的选项,以减少配置/构建时间。然后我随便吃饭。
我没有做任何详尽的测试,也没有没有我心爱的ImageMagick的备用干净Mac。但是,我构建了 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
如果有人对此有更多了解并可以添加一些见解-请通过评论或在答案的末尾添加并编辑新段落的方式告知我。