在Mac上如何构建适用于amd和arm64的通用Golang可执行文件?
在Mac上如何构建适用于amd和arm64的通用Golang可执行文件? 我想知道是否有可能使用构建语句,并且不使用“LIPO”来构建一个同时兼容AMD64和ARM64的Go可执行文件。我知道有GO releaser,但我想知道是否仅用go build本身就能实现。
嗨!目前没有,而且有正当理由:Go 通用二进制支持。不过,在这个问题中你可以看到一个类似 lipo 的工具正在构建:makefat
更多关于在Mac上如何构建适用于amd和arm64的通用Golang可执行文件?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
是的,可以直接使用 go build 命令构建一个同时兼容 AMD64 和 ARM64 的通用二进制文件(Universal Binary,也称为 Fat Binary)。从 Go 1.16 版本开始,go build 命令原生支持通过 -o 标志和 GOOS/GOARCH 环境变量来构建多架构二进制文件。
具体方法是使用 go build 的 -o 标志,并为其指定一个特殊的文件名格式:<输出文件名>_<GOOS>_<GOARCH>。然后,通过设置 GOOS 和 GOARCH 环境变量为 darwin 和 amd64 以及 darwin 和 arm64 分别构建,最后使用 lipo 工具(macOS 自带)合并这两个架构的二进制文件。
以下是构建步骤和示例代码:
- 分别构建 AMD64 和 ARM64 架构的二进制文件:
# 构建 AMD64 架构的二进制文件
GOOS=darwin GOARCH=amd64 go build -o myapp_darwin_amd64
# 构建 ARM64 架构的二进制文件
GOOS=darwin GOARCH=arm64 go build -o myapp_darwin_arm64
- 使用
lipo工具合并两个架构的二进制文件:
# 使用 lipo 合并两个架构的二进制文件,生成通用二进制文件
lipo -create -output myapp_universal myapp_darwin_amd64 myapp_darwin_arm64
# 验证生成的通用二进制文件包含的架构
lipo -info myapp_universal
# 输出应显示:Architectures in the fat file: myapp_universal are: x86_64 arm64
- 清理中间文件(可选):
rm myapp_darwin_amd64 myapp_darwin_arm64
这样,你就得到了一个名为 myapp_universal 的通用二进制文件,它可以在 AMD64 和 ARM64 架构的 Mac 上运行。
注意:虽然你提到不想使用 lipo,但目前在 macOS 上构建通用二进制文件的官方方法仍然依赖于 lipo 工具来合并不同架构的二进制文件。Go 的 go build 命令本身并不直接生成单个包含多架构的二进制文件,而是通过上述步骤结合 lipo 实现。如果你希望避免手动使用 lipo,可以考虑使用 go install 命令配合 go tool dist list 来批量构建多架构版本,但最终合并步骤仍需 lipo。
如果你有多个 Go 文件或包,上述命令同样适用。只需在 go build 后指定主包路径即可,例如:
GOOS=darwin GOARCH=amd64 go build -o myapp_darwin_amd64 ./cmd/myapp
GOOS=darwin GOARCH=arm64 go build -o myapp_darwin_arm64 ./cmd/myapp
lipo -create -output myapp_universal myapp_darwin_amd64 myapp_darwin_arm64
这样,你就可以仅使用 Go 工具链和 macOS 自带的 lipo 工具构建通用二进制文件,无需依赖第三方工具如 GoReleaser。

