golang交叉编译上遇到的问题!

deyen · 2022-08-25 23:55:51 · 5002 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-08-25 23:55:51 的主题,其中的信息可能已经有所发展或是发生改变。

本人使用的是linux,想要编辑一个程序exe到win10上运行。

然后往上找了一些相关内容,几乎千篇一律,估计大家也没遇到我的问题的。

命令行输入CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go然后报错如下

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go 
package command-line-arguments
    imports fyne.io/fyne/v2/app
    imports fyne.io/fyne/v2/internal/driver/glfw
    imports fyne.io/fyne/v2/internal/driver/common
    imports fyne.io/fyne/v2/internal/painter/gl
    imports github.com/go-gl/gl/v3.2-core/gl: build constraints exclude all Go files in /home/deyen/go/pkg/mod/github.com/go-gl/gl@v0.0.0-20211210172815-726fda9656d6/v3.2-core/gl

贵坛大佬估计不少,这个问题我觉得应该也不难,就是不知道该怎么解决。

报错的英文也不复杂,但就是不知道从哪里下手。在此先谢谢了~


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5002 次点击  
加入收藏 微博
20 回复  |  直到 2022-09-12 16:44:59
yleoer
yleoer · #1 · 3年之前

首先,amd64 linux 编译到 amd64 windows 的程序,命令应该是:

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

其次,fyne.io/fyne 这个库应该用了 CGO,需要安装响应的 gcc,指定 gcc 才能编译,例如:

CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-xxx-gcc CGO_LDFLAGS="-static" go build main.go
deyen
deyen · #2 · 3年之前
yleoeryleoer #1 回复

首先,amd64 linux 编译到 amd64 windows 的程序,命令应该是: ``` CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go ``` 其次,fyne.io/fyne 这个库应该用了 CGO,需要安装响应的 gcc,指定 gcc 才能编译,例如: ``` CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-xxx-gcc CGO_LDFLAGS="-static" go build main.go ```

按照你的提示去做,出现以下代码。

$ CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-xxx-gcc CGO_LDFLAGS="-static" go build main.go
# runtime/cgo
cgo: C compiler "x86_64-xxx-gcc" not found: exec: "x86_64-xxx-gcc": executable file not found in $PATH

(怎么我看网上有说法说cgo不支持交叉编译,所以CGO_ENABLED=0来着😂😂)

deyen
deyen · #3 · 3年之前
yleoeryleoer #1 回复

首先,amd64 linux 编译到 amd64 windows 的程序,命令应该是: ``` CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go ``` 其次,fyne.io/fyne 这个库应该用了 CGO,需要安装响应的 gcc,指定 gcc 才能编译,例如: ``` CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-xxx-gcc CGO_LDFLAGS="-static" go build main.go ```

不好意思,我问题上的输入是打错的了。实际上我是输入CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go的,返回的错误结果是一样的。

deyen
deyen · #4 · 3年之前
yleoeryleoer #1 回复

首先,amd64 linux 编译到 amd64 windows 的程序,命令应该是: ``` CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go ``` 其次,fyne.io/fyne 这个库应该用了 CGO,需要安装响应的 gcc,指定 gcc 才能编译,例如: ``` CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-xxx-gcc CGO_LDFLAGS="-static" go build main.go ```

反而我输入sudo CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go之后,出现了下面的提示:

go: downloading golang.org/x/sys v0.0.0-20220412211240-33da011f77ad
go: downloading github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9
go: downloading github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564
go: downloading fyne.io/systray v1.10.1-0.20220621085403-9a2652634e93
go: downloading github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211213063430-748e38ca8aec
go: downloading github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff
go: downloading golang.org/x/image v0.0.0-20220601225756-64ec528b34cd

然后一直不动了。。。。。 过了一个小时吧,就提示了一堆错误,里面有写着“time out"等字样。(有错误的那个提示页面被我不小心关掉了,所以没采集到错误放上来,又要等很久才能出那个错误) 您看看~

deyen
deyen · #5 · 3年之前
yleoeryleoer #1 回复

首先,amd64 linux 编译到 amd64 windows 的程序,命令应该是: ``` CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go ``` 其次,fyne.io/fyne 这个库应该用了 CGO,需要安装响应的 gcc,指定 gcc 才能编译,例如: ``` CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-xxx-gcc CGO_LDFLAGS="-static" go build main.go ```

这个解答上说”CGO_ENABLED:是否开启CGO,CGO即在Go代码中调用C代码交叉编译,但是交叉编译是不支持CGO的,也就是说如果你的代码中存在C代码,是编译不了的,所以需要禁用它“

解答网址:https://blog.csdn.net/qq_45173404/article/details/122618080#:~:text=%E6%89%80%E8%B0%93%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91%EF%BC%8C%E5%B0%B1,%E6%A4%8D%E6%80%A7%E7%9A%84%E5%8E%9F%E5%9B%A0%E4%B9%8B%E4%B8%80%E3%80%82

yleoer
yleoer · #6 · 3年之前

5楼 @deyen 这些说法都很笼统,

如果你的项目是纯 go 代码,那么交叉编译的时候需要设置 CGO_ENABLED=0 去关闭 CGO。

如果你的项目中有 C,那么关闭 CGO 肯定不行的,因为 C 代码也要编译。但仅仅开启 CGO 也是不行的,因为 go 编译器不知道怎么编译 C 代码,默认的 gcc 编译器不是对应系统的,所以需要使用 CC=xxx-gcc 的方式指定 C 的编译器。

而 fyne 的交叉编译可以看看官方文档:https://developer.fyne.io/started/cross-compiling#compiling-for-different-platforms ,上面明确提示了必须要使用 CGO_ENABLED=1 来开启编译 C 的功能。

yleoer
yleoer · #7 · 3年之前

2楼 @deyen 这里的 CC=x86_64-xxx-gcc 的意思是你要指定对应系统平台的 gcc 编译器 -.-,如果想编译 windows 的程序需要安装 x86_64-w64-mingw64-gcc 这个版本的 gcc 才可以。

yleoer
yleoer · #8 · 3年之前

4楼 @deyen 这个超时是因为无法拉取 golang.org/x 下面的项目,你需要翻墙或者搜索其他替代方法。

guokun1998
guokun1998 · #9 · 3年之前

拉取超时需要设置代理。https://goproxy.cn/

deyen
deyen · #10 · 3年之前
guokun1998guokun1998 #9 回复

拉取超时需要设置代理。https://goproxy.cn/

我的go env已经设置为GOPROXY="https://goproxy.cn,https://goproxy.io,direct"了呢,也是会提示超时,不知道为何。

deyen
deyen · #11 · 3年之前
yleoeryleoer #7 回复

2楼 @deyen 这里的 `CC=x86_64-xxx-gcc` 的意思是你要指定对应系统平台的 gcc 编译器 -.-,如果想编译 windows 的程序需要安装 x86_64-w64-mingw64-gcc 这个版本的 gcc 才可以。

运行后是这样的,linux上安装x86_64-w64-mingw64-gcc是要哪个包?包名叫什么?我用yum search mingw64一大堆东西

$ CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw64-gcc CGO_LDFLAGS="-static" go build main.go
# runtime/cgo
cgo: C compiler "x86_64-w64-mingw64-gcc" not found: exec: "x86_64-w64-mingw64-gcc": executable file not found in $PATH
deyen
deyen · #12 · 3年之前

什么情况?有人来帮帮我这弱小的菜鸡吗?

saberlong
saberlong · #13 · 3年之前

你需要补下编译相关的知识。gcc/g++是c/c++的编译工具。编译windows下能运行的需要GNU on Windows。MinGW就是这个东西。而你又要Linux下交叉编译windows的,所以需要在linux使用mingw而不是gcc。CC这个环境变量就是制定c的编译工具。还有个CXX指定c++编译工具

jan-bar
jan-bar · #14 · 3年之前

你可以试试我这个项目

编译sqlite,用了CGO:https://github.com/jan-bar/xgo/blob/master/tests/sqlite/build.sh

编译go-lua,编译lua的C代码:https://github.com/jan-bar/xgo/blob/master/tests/go-lua/build.sh

在linux下启用CGO编译window可执行程序,我已经做好了一个docker,应该能省你不少功夫。

deyen
deyen · #15 · 3年之前
saberlongsaberlong #13 回复

你需要补下编译相关的知识。gcc/g++是c/c++的编译工具。编译windows下能运行的需要GNU on Windows。MinGW就是这个东西。而你又要Linux下交叉编译windows的,所以需要在linux使用mingw而不是gcc。CC这个环境变量就是制定c的编译工具。还有个CXX指定c++编译工具

好的,我恶补一下编译相关的知识😂。好的感谢指路

deyen
deyen · #16 · 3年之前
jan-barjan-bar #14 回复

你可以试试我这个项目 编译sqlite,用了CGO:https://github.com/jan-bar/xgo/blob/master/tests/sqlite/build.sh 编译go-lua,编译lua的C代码:https://github.com/jan-bar/xgo/blob/master/tests/go-lua/build.sh 在linux下启用CGO编译window可执行程序,我已经做好了一个docker,应该能省你不少功夫。

好的,晚上回家有空看看

lysShub
lysShub · #17 · 3年之前

这玩意可以不能交叉编译,首先cgo就不太支持交叉编译,其次这玩意好像要个动态库才能跑起来

deyen
deyen · #18 · 2年之前
lysShublysShub #17 回复

这玩意可以不能交叉编译,首先cgo就不太支持交叉编译,其次这玩意好像要个动态库才能跑起来

由于经过多次折腾也没能成功,所以现在暂时先放弃了,现在直接换用window进行开发了。 (window上写代码真的没Linux爽)

jan-bar
jan-bar · #19 · 2年之前
deyendeyen #18 回复

#17楼 @lysShub 由于经过多次折腾也没能成功,所以现在暂时先放弃了,现在直接换用window进行开发了。 (window上写代码真的没Linux爽)

没研究我那个项目吗?linux编译window程序是没问题的。只是不能运行而已啊。

fuhuizn
fuhuizn · #20 · 2年之前

ubuntu上的例子: 先装好

mingw-w64
libz-mingw-w64

然后写这样一个脚本(用于编译win32):

#!/bin/sh
export CGO_ENABLED=1
export GOOS=windows
export GOARCH=386
export CC=i686-w64-mingw32-gcc
export CXX=i686-w64-mingw32-g++
go build -ldflags '-s -w -H=windowsgui'
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传