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看一下,如下圖,為所有的依賴庫,只剩下十幾個系統庫了,棒棒的。