
该错误源于 go 编译缓存中存在 macos(darwin)平台构建的 mysql.a 静态库,而当前在 linux 环境下编译时,链接器检测到平台与架构不匹配(darwin amd64 vs linux amd64),从而拒绝加载。核心解决方式是清除跨平台残留的编译产物。
该错误源于 go 编译缓存中存在 macos(darwin)平台构建的 mysql.a 静态库,而当前在 linux 环境下编译时,链接器检测到平台与架构不匹配(darwin amd64 vs linux amd64),从而拒绝加载。核心解决方式是清除跨平台残留的编译产物。
在使用 go-sql-driver/mysql(即官方 MySQL 驱动)时,若你在 CentOS 6.6(Linux amd64)环境下执行 go build 却遇到如下错误:
import /usr/local/go/pkg/linux_amd64/github.com/go-sql-driver/mysql.a: object is [darwin amd64 go1.4.2 X:precisestack] expected [linux amd64 go1.4 X:precisestack]
这表明 Go 工具链尝试加载一个为 macOS(darwin)平台编译的静态归档文件(.a),但当前运行环境是 Linux —— 二者的目标平台标识(GOOS/GOARCH)和 Go 版本元信息不一致,因此链接器直接中止构建。
根本原因
Go 的 pkg/ 目录用于缓存已编译的包对象(如 mysql.a)。当你曾在 macOS 上执行过 go install 或 go build(尤其在共享 GOPATH 或共用 $GOROOT/pkg 的多平台开发场景下),该目录可能混入了 darwin 构建产物。而 CentOS 系统读取到该 .a 文件后,因平台不匹配被拒绝使用,触发此报错。
解决方案:彻底清理编译缓存
✅ 推荐操作(安全且根治):
删除整个 $GOROOT/pkg 下对应平台子目录(或全部 pkg 内容),强制 Go 重新编译所有依赖:
# 查看当前 GOROOT(通常为 /usr/local/go) echo $GOROOT # 若未设置,则默认为安装路径 # 清理 Linux 平台缓存(关键!) rm -rf $GOROOT/pkg/linux_amd64 # 或更彻底(适用于多平台混用环境): rm -rf $GOROOT/pkg/*
⚠️ 注意:$GOROOT/pkg 存储的是标准库及第三方包的编译结果,删除后首次 go build 会稍慢(需重新编译依赖),但不会影响源码或配置,完全安全。
清理后,重新构建即可成功:
go build index.go
补充建议
- ✅ 避免跨平台污染:不同操作系统应使用独立的 $GOROOT,或至少不共享 pkg/ 目录;
- ✅ 优先使用模块模式(Go 1.11+):启用 GO111MODULE=on 后,依赖缓存移至 $GOPATH/pkg/mod,$GOROOT/pkg 仅存标准库,大幅降低此类冲突概率;
- ❌ 不要手动替换 .a 文件或修改文件头——Go 的二进制兼容性由工具链严格管控,强行修改将导致不可预知错误。
总结
该错误并非驱动本身或代码逻辑问题,而是 Go 构建缓存的平台一致性失效所致。“删 pkg,重编译”是最直接、最可靠的解法。养成定期清理或隔离平台缓存的习惯,可有效规避此类环境耦合问题。











