项目计划直接用二进制文件分发,本来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即可
有疑问加站长微信联系(非本文作者)