原文:https://blog.xiaoz.org/archives/18195
在使用GORM中,当使用sqlite作数据库时,跨平台编译会存在问题。
[error] failed to initialize database, got error Binary was compiled with ‘CGO_ENABLED=0’, go-sqlite3 requires cgo to work. This is a stub panic: Binary was compiled with ‘CGO_ENABLED=0’, go-sqlite3 requires cgo to work. This is a stub
大致意思是GORM SQLite驱动使用了CGO实现,需要在CGO环境下才能工作。
那么解决方法也很简单,只需要修改CGO_ENABLED这个环境变量启用CGO支持即可:
go env -w CGO_ENABLED=1
启用CGO后,编译的是动态链库的二进制文件,那么你一旦更换平台,比如将程序放到Windows下运行,可能因为缺少相关的一些动态链库(比如:SQLite)从而无法运行,为了保持编译的二进制文件能够无动态依赖的情况下正常运行,因此不得不考虑静态编译,所以就和GORM SQLite驱动产生了冲突。
解决方案:更换GORM默认的SQLite驱动
github.com/glebarez/sqlite这个库,该库使用纯go实现,不依赖CGO,地址是:https://github.com/glebarez/sqlite
于是将官方的驱动:
import ( “gorm.io/driver/sqlite” “gorm.io/gorm” )
更换为:
import ( “github.com/glebarez/sqlite” “gorm.io/gorm” )
这样就可以在不依赖CGO的情况下编译出静态二进制文件,从而解决跨平台依赖动态链库的问题。
代价
glebarez/sqlite性能不及官方驱动,但牺牲少部分性能来换取方便个人觉得还是值得的,如果没有跨平台需求,使用官方默认驱动即可
静态编译打包后的文件体积明显增加