在M1 Mac上强制使用Golang构建ARM64的方法
在M1 Mac上强制使用Golang构建ARM64的方法
目前在我的 M1 Mac 上运行以下命令进行构建,但它会构建为 amd64 架构。我希望构建为 arm64 架构。我尝试在命令前加上 GOARCH=arm64,但随后收到错误“package archwayhq/keyring-go/src/go: build constraints exclude all Go files in /Users/davidchoi/Work/philabs/node-api/hello-world/src/go”,即使我的 main.go 文件没有使用 // go:build 指令。不确定发生了什么。
go build -trimpath -buildmode=c-shared -ldflags '-w -s -extldflags "-lresolv"' -o keyring.so ./src/go
更多关于在M1 Mac上强制使用Golang构建ARM64的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
在Mac电脑上,需要使用的命令如下:
CGO_ENABLED=1 GOARCH=arm64 GOHOSTARCH=arm64 go build -trimpath -buildmode=c-shared -ldflags '-w -s -extldflags "-lresolv"' -o keyring.so -a ./src/go
更多关于在M1 Mac上强制使用Golang构建ARM64的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
根据你描述的问题,这看起来是一个交叉编译环境配置的问题。M1 Mac默认应该构建ARM64,但你的情况可能是由于某些环境变量或构建约束导致的。
首先,确认你的Go版本和当前环境:
go version
go env GOARCH GOOS
如果显示的是amd64,你可以强制设置环境变量:
GOARCH=arm64 go build -trimpath -buildmode=c-shared -ldflags '-w -s -extldflags "-lresolv"' -o keyring.so ./src/go
如果仍然遇到构建约束错误,可能是依赖包的问题。检查你的go.mod文件是否有平台特定的依赖。你可以尝试清理mod缓存:
go clean -modcache
然后查看是否有构建标签影响编译。运行以下命令检查:
go list -tags=arm64 ./src/go/...
如果问题依旧,可以尝试显式设置所有相关环境变量:
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -trimpath -buildmode=c-shared -ldflags '-w -s -extldflags "-lresolv"' -o keyring.so ./src/go
对于C-shared构建,还需要确保你的C工具链支持ARM64。检查Xcode命令行工具:
clang -v
如果问题仍然存在,可以尝试创建一个最小复现示例来排除项目特定问题:
// main.go
package main
import "C"
//export Hello
func Hello() *C.char {
return C.CString("Hello from ARM64")
}
func main() {}
然后用以下命令构建:
GOARCH=arm64 go build -buildmode=c-shared -o test.dylib main.go
最后,检查生成的二进制文件架构:
file keyring.so
# 应该显示:Mach-O 64-bit dynamically linked shared library arm64
如果以上方法都不行,可能需要检查你的项目是否有_arm64.go或!_arm64.go文件,或者go:build约束隐藏在依赖中。

