You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apple M1 Mac下Go语言运行ZeroMQ报错问题求助

在Apple M1 Mac上解决Go ZeroMQ架构不匹配的编译链接错误

问题背景

我按照ZeroMQ官方Go文档开发,执行了以下操作:

  • go mod init dailyPractice
  • go 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:

  1. 右键终端→获取信息→勾选「使用Rosetta打开」,重启终端
  2. 执行安装命令:
arch -x86_64 brew install zeromq

之后在该终端中运行Go程序,或指定GOARCH=amd64编译:

GOARCH=amd64 go run main.go

3. 使用纯Go实现的ZeroMQ库

选用纯Go编写的ZeroMQ库(无需依赖系统级C库),彻底避免架构不匹配问题,推荐go-zeromq/zmq4:

  1. 修改go.mod依赖,替换原有库:
module dailyPractice

go 1.18

require github.com/go-zeromq/zmq4 v0.12.0
  1. 执行go mod tidy更新依赖
  2. 适配库的示例代码:
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())
}
  1. 直接运行:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:05:36