有个小项目,使用sqlite3数据库,需要跨平台编译。我在Mac上开发的,现在编译一份windows平台的。

pre

编译的参数

GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
GOARCH:目标平台的体系架构(386、amd64、arm)
CGO_ENABLED: 是否开启CGO(事实证明交叉编译不支持CGO)

section 1

首先,我想到的是:

$ GOOS=windows GOARCH=386 CGO_ENABLED=1 go build  -o hello.exe

嗯,不出所料:

# runtime/cgo
gcc_libinit_windows.c:7:10: fatal error: 'windows.h' file not found

然后,google一下, fatal error: 'windows.h' file not found

嗯,stackoverflow,github...都瞄了一下,各种c库问题,各种解决方法参差不齐。

我这个人比较懒,决定换种解决方法。

section 2

联想到以前使用sqlite3项目需要交叉编译Linux平台的,我们采用过docker内编译的方法,我这里也尝试一下。

$ docker run --rm -i -v $GOPATH:/go  golang:1.11 bash
$ GOOS=windows GOARCH=386 CGO_ENABLED=1 go build  -o hello.exe

# runtime/cgo
gcc: error: unrecognized command line option '-mthreads'; did you mean '-pthread'?

还是存在问题。 那么继续Google一下。

在github go-sqlite3下我们发现有人提了相同的issue

有code反应,该如下解决:

$ apt-get update
$ apt-get install gcc-multilib
$ apt-get install gcc-mingw-w64

$ GOOS=windows GOARCH=386  CGO_ENABLED=1 CXX_FOR_TARGET=i686-w64-mingw32-g++ CC_FOR_TARGET=i686-w64-mingw32-gcc go build -o hello.exe

之后再次尝试,依然还是同样的问题。

section 3

Google一番未果,寻求同事帮助。

同事:“这问题我遇到过”

我:“怎么解决的”

同事: “没法解决,用sqlite3,mac上交叉编译不了win的”

我:“。。。”

同事:“装个Win虚拟机,直接在win上编译就OK了”

我:“。。。”

最后,顺利的在win虚拟机内编译成功该程序。

End