go - 无法使用 CGO AMD=> ARM 与 Xgo 交叉编译 Go 项目

标签 go arm cross-compiling

我正在开发实现 C 代码的 go 项目!

我可以在 linux/amd64 上构建项目,如果我们使用“IMPORT C”,我们现在就不会交叉编译。
所以我与 XGO 合作,这可能有助于我为 ARM 进行交叉编译。

我通过交叉编译没有 C 代码的 go 项目的版本来检查 XGO,它的工作方式类似于 go 的交叉编译。

我的环境:

go version go1.13.3 linux/amd64

去环境:
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.mode :
  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

正在检查 docker 安装...
客户:
版本:18.09.7
API版本:1.39
围棋版本:go1.10.4
Git 提交:2d0083d
建成时间:2019 年 8 月 16 日星期五 14:19:38
操作系统/架构:linux/amd64
实验:错误
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 !有人能帮我吗 ?谢谢

最佳答案

我终于找到了解决方案!

首先我安装在 ubuntu arm-linux-gnueabi-gcc 上,然后我只是添加到我的交叉编译命令 CC 中,例如:

env GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=arm-linux-gnueabi-gcc  go build 

它工作正常!

关于go - 无法使用 CGO AMD=> ARM 与 Xgo 交叉编译 Go 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59160109/

相关文章:

Go 的值方法接收者 vs 指针方法接收者

networking - 如何使用go编程语言在给定IP地址的情况下在网络上查找主机名

使用指针将数据从一个地址复制到另一个地址

c - 在与 ARM 架构兼容的 ELF 文件中查找 C 结构的地址

Android交叉编译C,无配置文件

http - 仅下载文件的一部分

go - 有大量互斥体有副作用吗?

gcc - 如何链接到外部 THUMB 代码?

c++ - 交叉编译和直接在目标上编译时所需的 GCC arm 选项之间的区别?

交叉编译。设置搜索库的最后位置