當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"
uj5u.com熱心網友回復:
就我而言,我還需要設定CGO_ENABLED為 true。該應用程式現在可以為 amd64 編譯良好GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go build
(感謝這個答案)
uj5u.com熱心網友回復:
wasm 問題的答案(如您發布的那樣)談到了 cgo。cgo 使用平臺特定的頭檔案/庫呼叫平臺編譯器(在 Mac 上,也有框架)。交叉編譯時CC,還需要交叉編譯編譯器 頭檔案/庫 框架。這并不容易:您可能需要像xgo這樣的工具。但仍然交叉編譯可能會失敗。
Go 則不同,Go 在每個 OS/arch 上在 go 或 plan9 ASM 中重新實作了一個 HAL。因此,當您在 arm64 上交叉編譯 cgo go for am64 時,將嘗試將“cgo arm64”與“go amd64”混合在一起go build。遺憾的是,對于內置go build工具來說,它是一個空集。
請參閱@fperson自己的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394310.html
上一篇:NodeJs訪問Jason檔案
