Golang使用Xgo进行跨平台编译时遇到CGO AMD到ARM的问题

Golang使用Xgo进行跨平台编译时遇到CGO AMD到ARM的问题 我正在开发一个包含C代码的Go项目! 我可以在linux/amd64上构建该项目,众所周知,如果使用"IMPORT C",Go无法进行交叉编译。因此我尝试使用XGO,它或许能帮助我交叉编译到ARM架构。 我测试了XGO,用它交叉编译了不包含C代码的Go项目版本,效果和Go的交叉编译一样。

我的环境:

go version go1.13.3 linux/amd64 Go env:

GO111MODULE="on"
GOARCH="amd64"
GOBIN="/opt/go/bin"
GOCACHE="/home/jj/.cache/go-build"
GOENV="/home/jj/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/opt/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/opt/go/src/github.com/brocaar/lora-app-server/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""

我的项目位于:

/opt/go/src/github.com/brocaar

包含C代码的包位于:

/opt/go/src/github.com/lorawan

我的项目的go.mod文件:

module github.com/brocaar/lora-app-server

go 1.12

replace github.com/brocaar/lorawan => /opt/go/src/github.com/brocaar/lorawan

require (
        cloud.google.com/go v0.44.3
        github.com/Azure/azure-service-bus-go v0.9.1
        github.com/NickBall/go-aes-key-wrap v0.0.0-20170929221519-1c3aa3e4dfc5
        github.com/aws/aws-sdk-go v1.19.19
        github.com/brocaar/loraserver v0.0.0-20190917115647-c4da45f52f2b
        github.com/brocaar/lorawan v0.0.0-20190814113539-8eb2a8d6da09
        github.com/dgrijalva/jwt-go v3.2.0+incompatible
        github.com/eclipse/paho.mqtt.golang v1.2.0
        github.com/elazarl/go-bindata-assetfs v1.0.0
        github.com/gofrs/uuid v3.2.0+incompatible
        github.com/golang/protobuf v1.3.2
        github.com/gomodule/redigo v2.0.0+incompatible
        github.com/goreleaser/goreleaser v0.106.0

       )

我用于交叉编译的命令是:

xgo -go 1.13.3  --targets=linux/arm-7 /opt/go/src/github.com/brocaar/lora-app-server/cmd/lora-app-server

出现的错误是:

src/github.com/brocaar/lora-app-server/cmd/lora-app-server
Checking docker installation... Client: Version: 18.09.7 API version: 1.39 Go version: go1.10.4 Git 
commit: 2d0083d Built: Fri Aug 16 14:19:38 2019 OS/Arch: linux/amd64 Experimental: false

Server:
 Engine:
    Version:          18.09.7
    API version:      1.39 (minimum version 1.12)
    Go version:       go1.10.4
    Git commit:       2d0083d
    Built:            Thu Aug 15 15:12:41 2019
    OS/Arch:          linux/amd64
    Experimental:     false

  Checking for required docker image karalabe/xgo-1.13.3... found.
  Cross compiling github.com/brocaar/lora-app-server/cmd/lora-app-server...
  Building locally github.com/brocaar/lora-app-server/cmd/lora-app-server...
  Bootstrapping linux/arm-7...
  go: github.com/brocaar/lorawan@v0.0.0-20190814113539-8eb2a8d6da09: parsing 
 /opt/go/src/github.com/brocaar/lorawan/go.mod: open 
 /opt/go/src/github.com/brocaar/lorawan/go.mod: no  such file or directory
 2019/12/03 16:02:37 Failed to cross compile package: exit status 1.

我真的不明白为什么它会说“没有那个文件或目录”,因为在lorawan文件夹里明明有go.mod文件!有人能帮我吗?谢谢。


更多关于Golang使用Xgo进行跨平台编译时遇到CGO AMD到ARM的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang使用Xgo进行跨平台编译时遇到CGO AMD到ARM的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


从错误信息来看,xgo在构建过程中无法找到/opt/go/src/github.com/brocaar/lorawan/go.mod文件。这通常是由于xgo的Docker容器内部路径与宿主机路径不匹配导致的。你的replace指令使用的是绝对路径,这在xgo的Docker环境中可能无法正确解析。

以下是解决方案:

  1. 修改go.mod中的replace指令: 将绝对路径替换为相对路径或模块名称:
module github.com/brocaar/lora-app-server

go 1.12

replace github.com/brocaar/lorawan => ../lorawan

require (
    // ... 其他依赖
    github.com/brocaar/lorawan v0.0.0-20190814113539-8eb2a8d6da09
)
  1. 或者使用vendor模式: 在项目根目录执行:
go mod vendor

然后修改go.mod移除replace指令:

module github.com/brocaar/lora-app-server

go 1.12

require (
    // ... 其他依赖
    github.com/brocaar/lorawan v0.0.0-20190814113539-8eb2a8d6da09
)
  1. 使用xgo时指定vendor模式
xgo -go 1.13.3 --targets=linux/arm-7 -v ./cmd/lora-app-server
  1. 如果问题仍然存在,检查Docker挂载: 可以尝试在xgo命令中明确指定项目路径:
xgo -go 1.13.3 --targets=linux/arm-7 -out lora-app-server github.com/brocaar/lora-app-server/cmd/lora-app-server
  1. 确保lorawan模块有正确的go.mod文件: 检查/opt/go/src/github.com/brocaar/lorawan/go.mod是否存在且内容正确:
module github.com/brocaar/lorawan

go 1.12

主要问题在于xgo的Docker容器无法访问宿主机的绝对路径/opt/go/src/github.com/brocaar/lorawan。通过使用相对路径或vendor模式,可以确保依赖在容器内部正确解析。

回到顶部