2

GOARCH当设置为arm64(或省略)时,我的应用程序编译良好。但是,当我尝试编译 amd64 二进制文件 ( GOOS=darwin GOARCH=amd64 go build) 时,我收到以下错误:

package [mainPackage]
        imports [internalPackageThatUsesC]: build constraints exclude all Go files in [pathToInternalPackageThatUsesC]

[internalPackageThatUsesC]由 3 个文件组成——一个带有实现的 Objective C 文件、一个头文件和一个为本地代码提供接口的 Go 文件。以下是 Go 文件:

// +build darwin

package [internalPackageThatUsesC]

/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa

#include <Cocoa/Cocoa.h>
#include "[headerFile].h"
*/
import "C"
import (
    "encoding/json"
    "sync"
    "unsafe"
)

... public functions that use the C library to interact with the native code

带有注释的名称[]意味着它们是实际名称的占位符。

我试图运行它,arch -x86_64但输出是相同的。

这里有什么问题?我需要添加另一个构建标签吗?

PS 我在 StackOverflow 上发现了关于这个错误的问题,但没有一个是关于为 amd64 编译的。这个问题是最接近的,但它是特定于 WebAssembly 的。

以下是结果go env

GO111MODULE=""
GOARCH="arm64"
GOBIN=""
GOCACHE="/Users/fperson/Library/Caches/go-build"
GOENV="/Users/fperson/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/fperson/.asdf/installs/golang/1.16.4/packages/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/fperson/.asdf/installs/golang/1.16.4/packages"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/fperson/.asdf/installs/golang/1.16.4/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/fperson/.asdf/installs/golang/1.16.4/go/pkg/tool/darwin_arm64"
GOVCS=""
GOVERSION="go1.16.4"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/fperson/workspace/personal_projects/timeow/timeow-mac/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/mh/02gmkb756x15018g919jcg980000gn/T/go-build4031963624=/tmp/go-build -gno-record-gcc-switches -fno-common"
4

2 回答 2

3

就我而言,我还需要设置CGO_ENABLED为 true。该应用程序现在可以很好地编译为 amd64GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go build

(感谢这个答案)

于 2021-12-25T22:17:11.847 回答
1

wasm 问题的答案(正如您发布的那样)谈到了 cgo。cgo 使用平台特定的头文件/库调用平台编译器(在 Mac 上,也带有框架)。使用 交叉编译时CC,还需要交叉编译编译器 + 头文件/库 + 框架。这并不容易:您可能需要像xgo这样的工具。但仍然交叉编译可能会失败。

Go 不同,Go 在每个 OS/arch 上的 go 或 plan9 ASM 中重新实现了一个 HAL。因此,当您在 arm64 上交叉编译 cgo + go for am64 时,go build将尝试将“cgo+arm64”与“go+amd64”混合。可悲的是,它是内置go build工具的空集。

请参阅@fperson自己的答案

于 2021-12-25T21:59:29.387 回答