[golang]如何在windows上使用cgo

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函数是非常有必要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值