美文网首页
[golang]如何在windows上使用cgo

[golang]如何在windows上使用cgo

作者: 一桶冷水 | 来源:发表于2017-05-27 11:43 被阅读0次

    golang的cgo是调用gcc编译c代码的,gcc工具链在linux上很方便,但windows上是没有的。而windows上一般用的vc,golang是不支持的。那么如果确实有这样的需求怎么办呢?用MinGW。

    一般linux上的包是不能直接在windows上编译的,除非借助Cygwin或者MSYS。(然后还有一大堆依赖要解决)。项目上要cgo调用的是ImageMagick,直接能找到vc编译好的库,省去了一堆麻烦事。

    这里要注意MinGW有32位和64位之分(MinGW-w64),务必不要装错了。(32位gcc的默认编译参数是兼容几十年前的386CPU,所以能放弃就放弃32位吧。。。好难得能甩掉那么陈旧的历史包袱)

    下一个问题是vc库的格式是.lib与gcc的.a是不同的,老版本的MinGW需要用reimp工具将lib转成a,新版本直接兼容lib格式,reimp也被移除了。考虑到后面链接参数比较难写,直接简单粗暴改名字了,CORE_RL_MagickCore_.lib -> libcore.a ,CORE_RL_MagickWand_.lib -> libwand.a。

    剩下的事情就和linux上差不多了,set环境变量C_INCLUDE_PATH为include路径,set环境变量CGO_LDFLAGS为-L "{lib路径}" -lcore -lwand,最后记得加上ImageMagick sdk 中定义的编译参数no_pkgconfig来屏蔽对pkgconfig的调用,go install -tags no_pkgconfig,完成。

    因为go有编译缓存,也就是$GOPATH/pkg,只要cgo部分代码不变更,是不需要加这部分参数的。所以如果要使用cgo,像ImageMagick sdk一样做一个薄封装,将c函数转成go函数是非常有必要的。

    相关文章

      网友评论

          本文标题:[golang]如何在windows上使用cgo

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