有个小项目,使用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