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

简介: 交叉编译cgo项目是出了名的困难,也是众所周知的GoReleaser的limitation。我建议您查看一下cgo cookbook,如果您还没有这样做的话。

前言


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

目录
相关文章
|
23天前
|
安全 Go
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
|
23天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
1月前
|
Ubuntu Linux 数据安全/隐私保护
Windows11 使用 WSL2部署Ubuntu
在管理员PowerShell中运行命令启用Windows子系统Linux和虚拟机平台,但安装Ubuntu时遇到错误。解决方法是下载NoLsp_fix_WSL2工具,以管理员权限进入其目录,使用工具指向WSL的路径(例如 `C:\windows\system32\wsl.exe`)进行修复,然后能成功打开Ubuntu。
39 4
|
1月前
|
存储 监控 安全
Go语言在身份认证与访问控制中的应用
【2月更文挑战第24天】随着信息技术的快速发展,身份认证与访问控制成为了保障系统安全的关键环节。Go语言作为一种高效、简洁且强大的编程语言,在身份认证与访问控制领域展现出了独特的优势。本文将探讨Go语言在身份认证、权限管理以及访问控制策略实施等方面的应用,并分析其在提升系统安全性方面的潜力。
|
1月前
|
存储 安全 算法
Go语言在数据加密与保护中的应用
【2月更文挑战第24天】Go语言以其高效的性能、简洁的语法和强大的标准库,在数据加密与保护领域获得了广泛的应用。本文详细探讨了Go语言在数据加密、数据脱敏、访问控制以及安全通信等方面的应用,并分析了Go语言在数据加密与保护方面的优势与未来趋势。
213 49
|
1月前
|
运维 Java Go
Go语言基础及其在容器化应用中的优势
【2月更文挑战第23天】本文首先介绍了Go语言的基本特性和优势,然后详细阐述了Go语言在容器化应用中的重要作用和独特优势。通过深入分析Go语言的语法简洁性、并发处理能力和内存管理特性,以及Docker容器技术的轻量级、可移植性和版本控制特点,本文旨在说明Go语言与Docker容器技术的结合能够显著提升应用的开发效率和部署灵活性,为现代软件开发和运维带来革命性的变革。
|
1月前
|
存储 消息中间件 大数据
Go语言在大数据处理中的实际应用与案例分析
【2月更文挑战第22天】本文深入探讨了Go语言在大数据处理中的实际应用,通过案例分析展示了Go语言在处理大数据时的优势和实践效果。文章首先介绍了大数据处理的挑战与需求,然后详细分析了Go语言在大数据处理中的适用性和核心技术,最后通过具体案例展示了Go语言在大数据处理中的实际应用。
|
1月前
|
安全 大数据 Go
Go语言在分布式系统中的应用
【2月更文挑战第20天】Go语言,以其独特的语言特性和出色的性能,逐渐成为分布式系统开发领域的热门选择。本文将深入探讨Go语言在分布式系统中的应用,分析其优势及实际应用案例,旨在为开发人员提供有价值的参考与启示。
|
1月前
|
Ubuntu 关系型数据库 MySQL
使用Ubuntu和Windows电脑实现Mysql主从同步(详细操作步骤)
使用Ubuntu和Windows电脑实现Mysql主从同步(详细操作步骤)
30 2
|
1月前
|
数据采集 监控 安全
Go语言在网络安全中的应用
【2月更文挑战第24天】Go语言,作为一种高效且易于维护的编程语言,近年来在网络安全领域得到了广泛的应用。本文旨在探讨Go语言在网络安全中的应用,包括其在防火墙、入侵检测、网络爬虫以及Web安全等方面的应用,并分析了Go语言在网络安全领域的优势与前景。