在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

2 回复

在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约束隐藏在依赖中。

回到顶部