Go语言怎么编译Windows程序_Go语言编译exe可执行文件教程【实用】
Windows上go build生成的exe打不开,需设GOOS=windows和GOARCH=amd64;CGO_ENABLED=0可避免DLL依赖但限制功能;图标、版本信息、UAC需用go-winres注入。Go build -o 生成的 exe 在 Windows 上打不开?先看 GOOS 和 GOARCHGo 默认按当前系统编译,你在 macOS 或 Linux 上直接 go build,得到的是对应平台的二进制,不是 Windows 的 .exe。必须显式设置环境变量或用 -ldflags 控制目标平台。Windows 可执行文件要求 GOOS=windows,否则即使后缀是 .exe,也可能是无效 PE 文件(双击无反应、提示“不是有效的 Win32 应用程序”)GOARCH 常见值:amd64(64 位)、386(32 位)。注意:Windows 10/11 默认不带 32 位运行时,GOARCH=386 编出的 .exe 在纯 64 位系统可能无法启动推荐命令:GOOS=windows GOARCH=amd64 go build -o myapp.exe main.go(Linux/macOS 下);Windows PowerShell 中要用 $env:GOOS="windows" 等语法,不如直接用 cmd + set GOOS=windows && set GOARCH=amd64 && go build -o myapp.exe main.goCGO_ENABLED=0 是不是必须加?什么时候会踩坑默认开启 CGO,意味着 Go 会链接系统 C 库(如 libc、msvcrt)。在 Windows 上,这会导致生成的 .exe 依赖 vcruntime140.dll 等 VC++ 运行时——目标机器没装对应 Visual C++ Redistributable 就直接报错:“找不到 vcruntime140.dll”。静态链接方案:CGO_ENABLED=0 go build -o myapp.exe main.go,生成纯 Go 实现的独立 .exe,不依赖外部 DLL,适合分发但代价明显:无法调用 C 函数、不能用 net 包的 DNS 解析(回退到纯 Go 实现,可能慢或不兼容某些配置)、os/user 和 os/exec 的部分功能受限如果你用了 #include <windows.h> 或调了 C.ReadFile 这类 cgo 代码,CGO_ENABLED=0 会编译失败,此时必须保留 CGO 并确保目标机有对应运行时图标、版本信息、UAC 提权这些怎么加进 .exeGo 原生不支持嵌入 Windows 资源(icon、version info、manifest),需要借助外部工具或链接器参数。加图标:用 go-winres 工具。先写 myapp.rc,含 IDI_ICON1 ICON "icon.ico",再执行 go-winres make 生成 resources.syso,最后 go build -o myapp.exe main.go resources.syso版本信息(公司名、版本号、描述)同样靠 go-winres 的 JSON 配置生成 resources.sysoUAC 提权(右键“以管理员身份运行”)需嵌入 manifest 文件。创建 myapp.exe.manifest,含 <requestedExecutionLevel level="requireAdministrator" />,再用 go-winres 注入;否则仅靠代码调用 syscall.MustLoadDLL("shell32").MustFindProc("ShellExecuteW") 无法真正提权交叉编译出来的 .exe 在 Windows 上闪退?检查 runtime 和 syscall不是所有 Go 标准库在 Windows 上都完全静态友好。有些函数在 CGO_ENABLED=0 下行为不同,甚至 panic。 VWO 一个A/B测试工具
