Golang Go语言在Windows下程序交叉编译使用什么编译链?

发布于 1周前 作者 h691938207 来自 Go语言

我搞了个小项目,用的是 goreleaser 来编译各环境应用,由于需要用到 sqlite 便在配置文件中把CGO_ENABLED 的值设置为 1 ,但是在编译过程中遇到各种各样的问题。

build failed after 10s                   error=failed to build for darwin_arm64: exit status 1: # runtime/cgo
cgo: C compiler "clang" not found: exec: "clang": executable file not found in %PATH%
-----------
  ⨯ build failed after 11s                   error=failed to build for linux_arm_6: exit status 1: # runtime/cgo
gcc: error: unrecognized command line option '-marm'; did you mean '-mabm'?
----------
failed to build for linux_amd64_v1: exit status 1: # runtime/cgo
arm-linux-gnueabi-gcc: error: unrecognized command-line option '-m64'

我觉得我已经脑掺了🙈🙈🙈


Golang Go语言在Windows下程序交叉编译使用什么编译链?

更多关于Golang Go语言在Windows下程序交叉编译使用什么编译链?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

16 回复

不是写了 clang 吗?
要不然去 LLVM 官网下,要不然用 MSYS2 里面的 clang 。

更多关于Golang Go语言在Windows下程序交叉编译使用什么编译链?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我已经在此 https://releases.llvm.org/ 下载并安装了,也设置了环境变量,之后就这样:
<br> ⨯ build failed after 11s error=failed to build for linux_arm_6: exit status 1: # runtime/cgo<br>gcc: error: unrecognized command line option '-marm'; did you mean '-mabm'?<br>

感谢老哥回复,现在心乱了,找时间我在研究

既然你用 goreleaser ,那就用它的容器

docker run --rm -v /source:/app -w /app goreleaser/goreleaser --verbose release --snapshot --clean --skip=announce,publish,validate

sqlite 不是有库吗为什么要用 c 版的

抱歉,我看错了,你需要的是交叉编译的工具链,那可能只能自己从源代码编译 darwin clang 了。

下载 zig ,然后有个 zig 的交叉编译工具链好像可以

这是以前弄得交叉编译 docker 制作方法。

https://github.com/jan-bar/xgo/blob/master/docker/readme.md

这里有个在 Linux 的 docker 交叉编译 window 的 sqlite 脚本,不过当时没有研究交叉编译 arm 的方法。但我感觉就是安装 arm64-gcc 的编译工具,然后给 go 设置环境变量即可。

https://github.com/jan-bar/xgo/blob/master/tests/sqlite/build.sh

还有这个纯 go 的 sqlite 驱动可以试试看: https://gitlab.com/cznic/sqlite

感谢老哥,我也试过用 docker 但编译 arm 还是会遇到问题

感谢 老哥,amd 的没得问题,就是在 arm 编译上遇到了问题,sqlite 的驱动我用 https://github.com/glebarez/sqlite

说真的,这种需求建议上专门的 cicd 环境搞,cgo 的交叉编译真的不太好做,除了 android 这种以外,剩下都建议在目标系统上做。

小项目别折腾了吧,找纯 go 实现的 sqlite 客户端库。

sqlite 使用 github.com/mattn/go-sqlite3 ,Window11+WSL 下编译起来还算方便

编译参数参考:
export CGO_ENABLED=1

# AMD64
#export GOOS=linux
#export GOARCH=amd64

export GOOS=linux
# arm
#export GOARCH=arm
#export CC=arm-linux-gnueabihf-gcc

# aarch64
# apt-get install -y aarch64-linux-gnu-gcc
export GOARCH=arm64
export CC=aarch64-linux-gnu-gcc

在Windows下,Golang(Go语言)进行程序交叉编译时,主要使用的是Go语言自带的交叉编译工具链。以下是对此的详细解释:

Go语言自带了强大的交叉编译功能,它允许开发者在一个平台上编译出适用于不同平台的二进制文件。这一功能的核心在于设置两个环境变量:GOOS和GOARCH。GOOS指定目标操作系统,如linux、windows、darwin等;GOARCH则指定目标架构,如amd64、386、arm等。

例如,要在Windows上编译出适用于Linux的可执行文件,可以如下设置环境变量并运行编译命令:

set GOOS=linux
set GOARCH=amd64
go build -o myprogram main.go

上述命令会生成一个名为“myprogram”的二进制文件,该文件可在Linux的amd64架构上运行。

此外,在进行交叉编译时,还需注意以下几点:

  1. 如果Go程序使用了cgo(Go语言中的C语言桥接),则需要确保目标平台的C编译器可用,或者通过设置CGO_ENABLED=0来禁用cgo。
  2. 编译依赖的第三方库可能不支持所有平台,需查阅库的文档或寻找替代方案。

综上所述,Golang在Windows下进行程序交叉编译时,主要依赖其自带的交叉编译工具链,并通过设置GOOS和GOARCH环境变量来指定目标平台和架构。

回到顶部