專案計劃直接用二進位制檔案分發,本來golang在這是沒有一點問題的,但是用了cgo引入ImageMagick,那就是另一回事了,ldd檢視依賴,整整一頁。。。
重新編譯ImageMagick
既然要做一個便攜版本,用不上的模組就先儘可能去掉。另外靜態編譯需要先生成靜態庫,不過ImageMagick的預設選項就是同時生成靜態庫和動態庫,這樣也不需要加額外的引數了。
./configure --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
複製程式碼
順便看看都是些什麼東西
-
AutoTrace - converts bitmap to vector graphics
-
DJVU 掃描格式,PDF的替代品
-
freetype 字型光柵化
-
lcms little color management system
-
lqr LiquidRescale
-
Pango 文字渲染
-
wmf windows 向量圖
-
OpenEXR exr格式
gopkg.in/gographics/imagick.v3/imagick
這是ImageMagick的golang sdk,其實就是cgo做了一個很薄的封裝。直接go build會自動呼叫pkg-config載入連結動態庫的引數,這裡要做靜態編譯,那就需要手動操作了。
編譯引數,直接pkg-config生成
export CGO_CFLAGS="`pkg-config --cflags MagickWand MagickCore`"
複製程式碼
連結引數,還是pkg-config,看看依賴了些什麼
pkg-config --libs --static MagickWand MagickCore
複製程式碼
將有環境依賴的庫配置為靜態編譯,其他的通用的庫維持動態庫連結不變。根據連結器的連結演算法,先發現符號引用,然後根據引用鏈入定義,應該把有依賴的庫放前面,被依賴的庫放後面。
export CGO_LDFLAGS="\
-Wl,-Bstatic \
`pkg-config --libs MagickWand MagickCore` \
-ljbig -ltiff -ljpeg -lwebp -llzma -lfftw3 -lbz2 -lgomp \
-Wl,-Bdynamic \
-llcms2 -llqr-1 -lglib-2.0 -lpng12 -lxml2 -lz -lm -ldl \
"
複製程式碼
清除編譯快取
rm -rf $GOPATH/pkg/linux_amd64/gopkg.in/gographics/imagick.v3
複製程式碼
編譯時加上no_pkgconfig的引數
go install -tags no_pkgconfig -v gopkg.in/gographics/imagick.v3/imagick
複製程式碼
最後go build即可