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