go交叉编译

go交叉编译

mohuangNPC
2025-12-24 / 0 评论 / 2 阅读 / 正在检测是否收录...

设置环境变量

set CGO_ENABLED=0
set GOOS=windows
set GOARCH=amd64

如果在idea等工具中的命令行无效,大概率是因为PowerShell问题,如图

mjjd5wsc.png

有两种解决方案

  1. 新开一个cmd窗口执行
  2. 使用go命令方式设置

    go env -w CGO_ENABLED=0
    go env -w GOOS=linux
    go env -w GOARCH=amd64

这里我是用第一种

执行编译

go build

注意

CGO

如果不设置CGO_ENABLED = 0,可能会提示如下错误

# runtime/cgo
gcc_linux_amd64.c: In function '_cgo_sys_thread_start':
gcc_linux_amd64.c:57:2: error: unknown type name 'sigset_t'; did you mean '_sigset_t'?
  sigset_t ign, oset;
  ^~~~~~~~
  _sigset_t
gcc_linux_amd64.c:62:2: error: implicit declaration of function 'sigfillset' [-Werror=implicit-function-declaration]
  sigfillset(&ign);
  ^~~~~~~~~~
gcc_linux_amd64.c:57:16: error: unused variable 'oset' [-Werror=unused-variable]
  sigset_t ign, oset;
                ^~~~
cc1.exe: all warnings being treated as errors

这个错误信息表明,你在 Windows 上进行 Go 代码编译时,Go 的 Cgo 部分尝试使用 C 编译器(在 Windows 上是 gcc)来编译与 C 语言相关的部分。因为你没有禁用 Cgo,而目标平台是 Linux,Cgo 正试图使用 Linux 的特定 C 库和头文件来编译,但你的 Windows 环境并没有适配 Linux 的相关编译工具和头文件。

此时有两种解决方案

禁用CGO

set CGO_ENABLED=0
//或者
go env -w CGO_ENABLED=0

只要你的 Go 项目没有依赖 Cgo,你可以通过禁用 Cgo 来避免这些问题。
如果你的 Go 代码依赖于 C 语言库或使用了 Cgo 特性(例如,调用 C 语言代码),禁用 Cgo 会导致编译失败。因此,你必须确保项目中不使用 Cgo。

安装 Linux 交叉编译工具链(如果需要使用 Cgo)

如果你必须使用 Cgo,或者你的项目依赖于某些 C 语言库,你需要配置适当的交叉编译工具链。这通常涉及到安装与目标平台(Linux)兼容的交叉编译工具链。

  • 对于 Linux 目标,你需要安装交叉编译工具链,如 mingw-w64 或 x86_64-linux-gnu-gcc 等。Windows 上的 Go 并不默认提供跨平台的 C 编译器,因此你需要额外安装交叉编译工具。
  • 配置工具链后,Go 编译器能够在 Windows 上使用目标 Linux 平台的 C 编译器来编译 Cgo 代码。
0

评论 (0)

取消

Warning: file_put_contents(/var/www/html/rss.xml): failed to open stream: Permission denied in /var/www/html/usr/plugins/CustomRSS/Plugin.php on line 149