是否可以为 High Sierra/Mojave 编译静态/便携式版本的 ImageMagick?

问题描述 投票:0回答:1

这个问题已经在 4 年前被问过,所以 High Sierra/Mojave 部分是新的。这是未回答问题的链接: 编译imagemagick Convert util的静态版本

我正在尝试编译 IM 的便携式版本,我可以将其包含在可在其他 MacOS 计算机上使用的脚本中,而无需首先在计算机上安装开发人员工具或 Mac Ports。我看到 ImageMagick.org 为 Windows 提供了静态和可移植的构建,但只为 OS X/Darwin 提供了预编译的二进制文件。

当我尝试在全新安装 Mojave 的 Mac 上运行预编译版本时,我得到以下信息:

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 的任何指示或提示都将非常棒!

macos compilation imagemagick
1个回答
2
投票

我不是这方面的专家,但我在某处读到Apple链接器总是更喜欢动态库而不是静态库,即它选择以

.dylib
结尾的库而不是以
.a
结尾的库。

因此,我复制了您的 shell 脚本并对其进行了编辑以构建 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

如果有人对此了解更多并可以添加一些见解 - 请通过评论或在答案末尾编辑和添加新段落来告诉我。


响应 @emendelson 的评论添加的如果您想使用 JPEGXL,您需要执行以下步骤在上面的答案之前

brew install pkg-config
brew install jpeg-xl

# This should work on Intel and Apple Silicon Macs
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$(brew --prefix)/lib/pkgconfig

./configure | grep "JPEG XL"
JPEG XL           --with-jxl=yes            yes

您正在最右边的列中寻找

yes
,以确保内置 JPEG-XL 支持。然后只需使用以下命令构建和安装:

make -j && make install
© www.soinside.com 2019 - 2024. All rights reserved.