前言
续上文,《go项目,github actions自动打包exe发布版本》
在github actions 里CI 构建exe的时候,cgo会报错
# runtime/cgo gcc: error: unrecognized command line option ‘-mthreads’; did you mean ‘-pthread’?
后面排查到是由于使用了sqlite
导致的
资料引用
交叉编译cgo项目是出了名的困难,也是众所周知的GoReleaser的limitation。我建议您查看一下cgo cookbook,如果您还没有这样做的话。
至于你在ubuntu上遇到的错误,看起来你的C工具链没有正确的依赖项/功能来交叉编译成windows。
我自己没有做过任何CGO交叉编译(试图不惜一切代价避免它),所以我不能保证这个工具,但从我在网上阅读的内容来看,xgo
也许能够帮助你。
确保在Ubuntu上安装了MinGW:sudo apt-get install gcc-mingw-w64-i686和sudo apt-get install gcc-mingw-w64-x86-64
使用以下命令进行编译:GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared -o main.dll main.go和GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -buildmode=c-shared -o main.dll main.go
以上我没有验证过,我使用的是另一个方案去解决sqlite的cgo问题
问题解决
从百度上查到 "gorm.io/driver/sqlite"
这个gorm的驱动包使用的是cgo依赖
sqlite驱动有很多,但是绝大多数都是cgo写的,也就是纯粹c语言,不支持交叉编译,或者一些并不遵循database/sql标准. cgo驱动https://github.com/mattn/go-sqlite3这个应该是最出名的,用的也多,但是不支持交叉编译,windows上需要安装gcc才能编译,非常不方便.
本文推荐的是另一个modernc.org/sqlite但是他在github上边没有,而是在gitlab上,用起来也不方便,于是乎我就搬到了github 包的地址github.com/logoove/sqlite,这个库是唯一不使用cgo,支持标准database/sql.
然后引入了该包进行一些测试,连接是正常的,但是没有相关资料和文档可以置入Gorm中,有一些issue说是直接与官方包可以替换,但是我尝试之后发现语法和返回类型不一致,无法直接替换
后续在Gorm的文档看到一个推荐的纯Go实现的sqlite驱动包github.com/glebarez/sqlite
替换成了这个包,就可以正常使用编译了