Apple M1 Mac下Go语言运行ZeroMQ报错问题求助
在Apple M1 Mac上解决Go ZeroMQ架构不匹配的编译链接错误
问题背景
我按照ZeroMQ官方Go文档开发,执行了以下操作:
go mod init dailyPracticego mod tidy- 通过
brew install zeromq安装ZeroMQ go run main.go
我的go.mod文件内容:
module dailyPractice go 1.18 require github.com/zeromq/goczmq v4.1.0+incompatible
运行程序时出现架构不匹配错误,提示构建x86_64架构但尝试链接arm64版本的库,换用pebbe/zmq4后仍遇到相同问题,尝试过相关解决方案未奏效。
解决方案
1. 强制Go以arm64架构编译运行
M1芯片为arm64架构,brew默认安装的ZeroMQ库是arm64版本,直接指定Go的架构为arm64即可:
GOARCH=arm64 go run main.go
若需持久生效,可设置环境变量:
export GOARCH=arm64
之后再执行go run main.go即可。
2. 在Rosetta终端中安装x86_64版本的ZeroMQ
如果你的终端是通过Rosetta运行的x86_64环境,需在该环境下重新安装ZeroMQ:
- 右键终端→获取信息→勾选「使用Rosetta打开」,重启终端
- 执行安装命令:
arch -x86_64 brew install zeromq
之后在该终端中运行Go程序,或指定GOARCH=amd64编译:
GOARCH=amd64 go run main.go
3. 使用纯Go实现的ZeroMQ库
选用纯Go编写的ZeroMQ库(无需依赖系统级C库),彻底避免架构不匹配问题,推荐go-zeromq/zmq4:
- 修改go.mod依赖,替换原有库:
module dailyPractice go 1.18 require github.com/go-zeromq/zmq4 v0.12.0
- 执行
go mod tidy更新依赖 - 适配库的示例代码:
package main import ( "fmt" "github.com/go-zeromq/zmq4" ) func main() { req := zmq4.NewReq() defer req.Close() if err := req.Dial("tcp://localhost:5555"); err != nil { panic(err) } if err := req.Send(zmq4.NewMsgString("hello")); err != nil { panic(err) } msg, err := req.Recv() if err != nil { panic(err) } fmt.Printf("Received: %s\n", msg.String()) }
- 直接运行:
go run main.go
4. 编译支持双架构的ZeroMQ通用库
若必须使用CGo绑定的ZeroMQ库,可手动编译支持arm64和x86_64的通用(fat)二进制库:
git clone https://github.com/zeromq/libzmq.git cd libzmq mkdir build && cd build cmake -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" .. make sudo make install
完成后,系统中的ZeroMQ库将支持两种架构,Go程序编译链接时会自动匹配对应架构。
内容的提问来源于stack exchange,提问作者tao
相关产品推荐
相关产品推荐

