在Windows上怎么用GO交叉编译linux+arm目标码

我是在window上面,使用mingw环境,用源码带的make.bat从源码构建了一套go编译器:

GOOS=windows GOARCH=amd64 ./make.bat

当编译本地程序的时候,使用

./go build -buildmode=c-archive -o hello.a main.go

可以生成windows本地的.a库文件。

但是如果使用以下命令进行交叉编译(预期生成Linux+arm的.a):

GOSO=linux GOARCH=arm CGO_ENABLED=1 ./go build -buildmode=c-archive -o hello.a main.go  

则会报错:

runtime/cgo

gcc.exe: error: unrecognized command line option '-pthread'

我有三个问题:

1)'-pthread'这个参数是谁用的,是在哪设置的、能否修改?

2)我在windows上面,用上述命令交叉编译linux+arm上的库文件,这种用法有没有问题?

3)如果上述命令有问题,能否给个在windows+amd64上使用go编译器,生成linux+arm的静态库.a的详细步骤?

感谢!

我也遇到了这个问题 要在哪里添加 链接库

交叉编译的话,最好在虚拟机的linux系统上搞吧。在windows上失败,有可能的。
最好不要在windows上面交叉编译linux+arm上的库文件

在虚拟机的linux下试试行不行?

有没有大神给指点迷津?
golang在windows上的交叉编译到底怎么处理?
是golang支持问题还是用法有问题?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题解答

    问题1: "-pthread"参数的使用、设置和修改方式是什么?

    "-pthread"参数是GCC编译器的一个选项,用于添加对多线程程序的支持。在编译时,它会链接相应的线程库以实现多线程功能。

    在Windows系统上,通常会使用MinGW或者MinGW-W64来编译和链接程序。这些工具链默认使用"-pthread"参数,以确保在Windows上正确地链接POSIX线程库。

    如果你不想使用"-pthread"参数,可以通过修改编译命令来去除它。在后面的解答中,将介绍如何通过修改编译命令来交叉编译生成Linux+arm目标码,并可以选择不使用"-pthread"参数。

    问题2: 在Windows系统上使用交叉编译生成Linux+arm库文件的方法是否正确?

    对于使用Go语言的交叉编译,通常我们会使用GOOSGOARCH环境变量,分别用于指定目标操作系统和目标架构。

    但是,GO语言工具链自身并不支持直接交叉编译生成Linux+arm目标码。为了实现该功能,我们需要使用一些附加工具来辅助完成。下面将给出具体步骤进行解答。

    问题3: 如何在Windows系统上使用GO编译器生成Linux+arm静态库.a?

    为了在Windows系统上使用GO编译器生成Linux+arm的静态库,我们需要借助以下工具和步骤:

    1. 安装MinGW或MinGW-W64工具链: 首先,确保已经安装了MinGW或MinGW-W64工具链。你可以从官方网站下载安装包进行安装。安装的过程中,请选择安装mingw32-gcc和mingw-w64-x86_64-gcc这两个软件包,以便使用GCC编译器进行交叉编译。

    2. 设置环境变量: 在使用交叉编译之前,需要设置相关的环境变量。打开命令行终端,并执行以下命令来设置环境变量:

    sh set GOOS=linux set GOARCH=arm set CC=mingw32-gcc

    这里,GOOS环境变量设置为"linux",GOARCH环境变量设置为"arm",CC环境变量设置为"mingw32-gcc"。这些设置将告诉Go编译器在交叉编译时使用指定的目标系统和编译器。

    1. 使用Go编译器进行交叉编译: 在设置好环境变量后,通过以下命令使用Go编译器进行交叉编译生成Linux+arm静态库:

    sh go build -buildmode=c-archive -o yourlib.a yoursource.go

    这里,-buildmode=c-archive选项指定了编译模式,将生成C语言可用的静态库。yourlib.a是生成的静态库文件名,yoursource.go是你的Go源文件名。

    经过上述步骤,Go编译器将会交叉编译生成Linux+arm的静态库文件。你可以将该库文件移动到你希望的目录下,并在Linux系统中使用。

    希望上述步骤能够解决你的问题。如果你还有其他问题或需要进一步帮助,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^