美文网首页Golang 开发者Go语言Golang
[golang] cgo项目如何编译便携版二进制文件

[golang] cgo项目如何编译便携版二进制文件

作者: 一桶冷水 | 来源:发表于2017-05-16 18:50 被阅读246次

项目计划直接用二进制文件分发,本来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即可

相关文章

  • [golang] cgo项目如何编译便携版二进制文件

    项目计划直接用二进制文件分发,本来golang在这是没有一点问题的,但是用了cgo引入ImageMagick,那就...

  • Docker 坑集

    在alpine镜像中添加golang二进制文件需要使用关闭环境变量CGO_ENABLEDCGO_ENABLED=0...

  • Alpine Linux Docker 中提示 sh: comm

    最近有项目需要上线,项目的各个服务都是由 golang 写的。启动服务直接运行编译好的二进制文件就行,于是准备使用...

  • 升级到Catalina后,golang执行问题

    升级到Catalina 10.15后,golang编译完成后,执行二进制文件报错:dyld: malformed ...

  • go如何进行交叉编译

    golang交叉编译 问题 golang如何在一个平台编译另外一个平台可以执行的文件。比如在mac上编译Windo...

  • Go 语言编译过程概述

    Golang 是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件...

  • CGO使用

    参考文章: http://golang.org/cmd/cgo is the primary cgo docume...

  • go 实现交叉编译

    将Golang程序 在windows下编译成Linux下可执行的二进制文件并且执行 设置编译环境 在xx.go所在...

  • golang嵌入式开发

    一、项目概述 本项目是golang嵌入式开发方法,主要是为嵌入式开发平台打造,基于cgo实现了golang对于/d...

  • golang 编译cgo模块exec: "gcc": execu

    golang编译cgo第三方包(sqlite3)时会提示 linux下好解决,原生gcc,windows下面据说要...

网友评论

  • 5c5ddc53f0e9:我想请教一下如何在linux下面用c编译出一个独立的ImageMagick(想在node里面调用,但是感觉让用户主动安装体验不好),查阅的很多资料都无果,不知道您能否说明一下,谢谢!
    一桶冷水:建议用c或者go在原有的ImageMagick上套一层壳,封装成一个新应用,然后直接调用就好。linux经常有依赖兼容问题,二进制便携包不好做。

本文标题:[golang] cgo项目如何编译便携版二进制文件

本文链接:https://www.haomeiwen.com/subject/fonlxxtx.html