golang 1.16 cgo/clang 构建在 darwin/arm64 上失败

问题描述

我正在尝试使用 cgo 构建一些 go 代码,但在 darwin/arm64 go1.16beta 上构建失败。

我的 go env 是

GO111MODULE="off"
GOARCH="arm64"
GOBIN=""
GOCACHE="/Users/a/Library/Caches/go-build"
GOENV="/Users/a/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/a/go/pkg/mod"
GOnopROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/a/go"
GOPRIVATE=""
goproxy="https://goproxy.io,direct"
GOROOT="/usr/local/go"
GOSUMDB="off"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_arm64"
GOVCS=""
GOVERSION="go1.16beta1"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONfig="pkg-config"
GOGCCFLAGS="-fPIC -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/gg/fgcf1wps4tz51d_x38ybzpv00000gn/T/go-build2055022242=/tmp/go-build -gno-record-gcc-switches -fno-common"

开始构建

>>>
/usr/local/go/pkg/tool/darwin_arm64/link: running clang Failed: exit status 1
ld: warning: ignoring file /var/folders/gg/fgcf1wps4tz51d_x38ybzpv00000gn/T/go-link-948954574/go.o,building for macOS-x86_64 but attempting to link with file built for unkNown-arm64
...
Undefined symbols for architecture x86_64:
  "_main",referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command Failed with exit code 1 (use -v to see invocation)

go build -v -ldflags="-linkmode=internal"

>>>

loadmacho: /Users/haoliu/Library/Caches/go-build/67/6777448f029f7eb3953d5848709f80c5ab0f3bf855d852152a1d23834392afea-d(_x001.o): mach-o object but not arm64
loadmacho: /Users/haoliu/Library/Caches/go-build/67/6777448f029f7eb3953d5848709f80c5ab0f3bf855d852152a1d23834392afea-d(_x002.o): mach-o object but not arm64

我尝试下载 llvm/clang 并从源代码构建,但 clang 目标仍然是 x86_64-apple-darwin20.1.0

解决方法

使用homebrew/arm64下载llvm/arm64后,问题解决。

arch=arm64 brew install llvm