Siam博客

go在ubuntu交叉编译windows应用.cgo错误

2022-11-13

前言

续上文,《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 替换成了这个包,就可以正常使用编译了

本文链接:
版权声明: 本文由 Siam原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
Tags: Go

扫描二维码,分享此文章