1. 程式人生 > >linux下編譯ImageMagick靜態庫

linux下編譯ImageMagick靜態庫

按照文中配置編譯好的ImageMagick c靜態庫下載地址:下載地址

專案中需要在linux下開發一個動態庫,但是直接連結imagemagick動態庫,會發現最後生成的動態庫所依賴的庫將近100來個。

如下圖,依賴庫太多,展示一部分:

基本都是imagemagick的依賴庫,因此,編譯ImageMagick靜態庫勢在必行。

首先解壓縮ImageMagick.tar.gz

tar xvzf ImageMagick.tar.gz
cd ImageMagick-7.0.5

 然後,開始編譯。既然要做一個便攜版本,用不上的模組就先儘可能去掉。

CFLAGS="-fPIC" ./configure --prefix=/usr/local/ImageMagick --enable-shared=no --enable-static=yes --with-djvu=no --with-fontconfig=no --with-freetype=no --with-magick-plus-plus=no --with-openexr=no --with-pango=no --with-wmf=no --with-x=no 

這幾項的意思分別是:

DJVU 掃描格式,PDF的替代品

freetype 字型光柵化

magick-plus-plus mafick++

Pango 文字渲染

wmf windows 向量圖

OpenEXR exr格式

我專案中只是簡單對影象的操作,不涉及文字繪製,用的是magick c庫,因此將如上的全都去掉。

ImageMagick的預設選項就是同時生成靜態庫和動態庫,為了生成便攜的靜態庫版本,配置項中需宣告--enable-shared=no --enable-static=yes。而開頭的CFLAGS="-fPIC",是因為linux64 下,必須使用位置無關程式碼,否則使用生成的ImageMagick靜態庫編譯連線自己動態庫時,會連線失敗,顯示“

 relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

... could not read symbols: Bad value”。

接下來,直接make就可以了。

make
make install

make完成,會在/usr/local下生成ImageMagick資料夾,所需要的靜態庫在lib目錄下,標頭檔案在include目錄下,可直接使用。

makefile檔案中連線ImageMagick目錄和庫方式如下:

INCLUDES=-I/usr/local/ImageMagick/include/ImageMagick-7

LIBS=-L/usr/local/ImageMagick/lib -Wl,-Bstatic -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI -L/usr/local/lib  -Wl,-Bdynamic -liconv

在應用程式需要連線外部庫的情況下,linux預設對庫的連線是使用動態庫,在找不到動態庫的情況下再選擇靜態庫。
當對動態庫與靜態庫混合連線的時候,需要作用-Wl的方式:

-Wl,-Bstatic -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI -L/usr/local/lib  -Wl,-Bdynamic -liconv


另外還要注意系統的執行庫使用動態連線的方式,所以當動態庫在靜態庫前面連線時,必須在命令列最後使用動態連線的命令才能正常連線

-Wl,-Bdynamic -liconv -Wl,-Bstatic -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI -L/usr/local/lib -Wl,-Bdynamic 


最後的-Wl,-Bdynamic表示將預設庫連結模式恢復成動態連結。

再來重新make自己的動態庫,ldd看一下,如下圖,為所有的依賴庫,只剩下十幾個系統庫了,棒棒的。