在windows上如何编译出arm64架构可跑的go程序

这是一个积累的记录,比较杂乱,但是看完了应该可以跑通这个目标,放在这里做参考

ini 复制代码
$env:CGO_ENABLED="1"        # PowerShell
csharp 复制代码
# 如果还没装 scoop
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
irm get.scoop.sh | iex

# 装 gcc
scoop install gcc
csharp 复制代码
# 1. 添加 extras 仓库(仅需一次)
scoop bucket add extras

# 2. 搜索确认名字
scoop search gcc-arm64

# 3. 安装(名称要带 -gcc)
scoop install gcc-arm64-linux-gnu-gcc
sql 复制代码
PS C:\gitcodes\log-processor> scoop search gcc Results from local buckets...

Name Version Source Binaries ---- ------- ------ --------

avr-gcc 15.2.0 main gcc 13.2.0 main

xtensa-esp32-elf 11_2_0-esp-2022r1 main

xtensa-esp32-elf-gcc.exe | xtensa-esp32-elf-gcc-ar.exe | xtensa-esp32-elf-gcc-nm.exe | xtensa-esp32-elf-gcc-ranlib.exe

gcc-aarch64-none-elf 14.3.rel1 extras

gcc-aarch64-none-linux-gnu 14.3.rel1 extras

gcc-arm-none-eabi 14.3.rel1 extras

gcc-arm-none-linux-gnueabihf 14.3.rel1 extras

extras 里并没有叫 gcc-arm64-linux-gnu 的 manifest,

"gcc-aarch64-none-linux-gnu" 就是我们要的交叉工具链 (命名惯例不同,功能一样)。

安装它即可:

css 复制代码
scoop install gcc-aarch64-none-linux-gnu

装完后 scoop 会自动把 bin 目录加进 PATH。

重新打开 PowerShell,验证:

css 复制代码
aarch64-none-linux-gnu-gcc -v

能输出版本号就说明 OK。

接下来按之前步骤设置环境变量即可交叉编译:

ruby 复制代码
$env:CGO_ENABLED='1'

$env:GOOS='linux'

$env:GOARCH='arm64'

$env:CC='aarch64-none-linux-gnu-gcc'

go build  -ldflags '-linkmode external -extldflags "-static"' -o myapp-linux-arm64 .

静态链接 vs 动态链接(默认)

场景 静态链接 动态链接(默认)
生成的可执行文件体积 大(把 libc 等全拷进去) 小(只留符号表)
目标板依赖 零依赖,只要内核架构对就能跑 需要对应版本.so 存在(如 /lib/aarch64-linux-gnu/libc.so.6
启动速度 稍快(不用动态重定位) 稍慢
升级/安全补丁 要重新编译整个程序 只换系统 .so 即可
Go 默认行为 不开 -static 就是动态 ;交叉时如果工具链里能找到 .so,Go 会优先动态链接

一句话总结

  • 静态链接 = 把 libc 等全部打包进一个文件,目标板不需要额外库,体积大但部署简单。
  • 默认的动态链接 = 可执行文件小,运行时依赖目标板的共享库 ;版本不一致就会报 no version information availablenot found
  • 嵌入式、容器、未知系统环境,建议静态 ;桌面发行版、可控环境,可以动态

既然我都要跨平台编译了,我当然选静态,一劳永逸不折腾

相关推荐
犀利豆8 小时前
AI in Harness(三)
人工智能·后端
IT_陈寒9 小时前
Java的Stream.parallel()把我CPU跑爆了,这种优化要谨慎
前端·人工智能·后端
子兮曰10 小时前
Bun 重写为 Rust:11天、64个Claude、16.5万美元,一次改变行业认知的激进实验
前端·后端·bun
子兮曰10 小时前
Node.js v26.5.0 深度解读:import Text、流式 ReadableStreamTee、以及隐藏的安全加固浪潮
前端·后端·node.js
子兮曰10 小时前
TypeScript 7.0 RC 深度解读:Go 重写完成,10 倍提速,编译器的「奇点时刻」
前端·后端·typescript
kosan10 小时前
.NET/C# 实战:我如何把登录验证码从“裸奔”改到“铜墙铁壁”
后端
王中阳Go11 小时前
AI编程实践:规则 + 技能 + 子代理 + 钩子,拆解Trae AI 开发规范的完整落地范式
后端·agent·ai编程
码事漫谈11 小时前
放下代码洁癖,享受挖坑人生
后端
_张有志_11 小时前
手撕 STL:一棵红黑树,凭什么同时撑起 set 和 map?
后端
妙码生花11 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(二十七):管理员登录验证码开关
前端·后端·ai编程