Fork me on GitHub

macOS下golang 交叉编译失败小记

这段时间在AIOT小组支援,需要做一个在工控机(ubuntu系统)上运行的HTTP服务,用Golang实现,使用sqlite3作为存储。

在 macOS 上编译 Linux 可执行文件时,遇到了一些坑,这里做下记录。

1
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./httpServer ./

编译没有任何问题,可真正到工控机上运行的时候,报了 go-sqlite3 包未 import 的问题。

models setup fail err:sql: unknown driver “sqlite3” (forgotten import?)

查了一下,
go-sqlite3 is cgo module. so you need to install cross C compiler.
大意是go-sqlite包使用了CGO module,所以编译时要开启CGO_ENABLED,即

1
CGO_ENABLED=1

还需要安装C交叉编译器

1
$ brew install FiloSottile/musl-cross/musl-cross

这个安装耗时比较久,大概要40分钟(我的本子风扇会呼啦啦转,发热严重),但请耐心等待安装完成。

然后使用下面的命令就可以编译成功了!!!

1
CC=x86_64-linux-musl-gcc CXX=x86_64-linux-musl-g++ GOARCH=amd64 GOOS=linux CGO_ENABLED=1 go build -ldflags "-linkmode external -extldflags -static" -o ./httpServer ./

参考:

  1. Github上go-sqlite3相关issue