Golang中ARM V7版本已停止下载支持

Golang中ARM V7版本已停止下载支持 有人能帮帮我吗。

2 回复

Dave Cheney 说:

ARMv6 向上兼容 ARMv7 系统。在 ARMv7 系统上运行 ARMv6 二进制文件没有实质性的性能差异。

(来源)

我还在另一个网站上看到,这些架构之间的变化很小:http://single-boards.com/armv6-vs-armv7/,但我没有找到更多关于指令和硬件差异的详细描述。

您寻找 ARMv7 而不是 ARMv6 是否有特定的原因?

更多关于Golang中ARM V7版本已停止下载支持的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,Go 1.21 版本之后,官方已停止为 ARMv7 提供预编译的二进制分发版。但这并不意味着 Go 语言本身不再支持 ARMv7 架构。你仍然可以通过从源代码编译来获取适用于 ARMv7 的 Go 工具链。

以下是两种主要的解决方案:

方案一:在 ARMv7 设备上从源码编译 Go(推荐)

这是最直接的方法。你可以在你的 ARMv7 设备(如树莓派 2/3,或旧款安卓设备)上,使用一个现有的、较旧的 Go 版本作为“引导编译器”(bootstrap compiler)来编译最新版本的 Go 源码。

操作步骤:

  1. 安装前置依赖和引导编译器: 确保你的系统已安装 Git、C 编译工具链(如 gcc)。然后安装一个较旧的、支持 ARMv7 的 Go 版本(例如 Go 1.20)。你可以从 Go 官方下载存档 找到 go1.20.linux-armv6l.tar.gz(通常 armv6l 版本在 armv7 上也能运行)。

    # 以 root 或使用 sudo
    # 1. 下载并解压 Go 1.20 作为引导编译器
    wget https://go.dev/dl/go1.20.linux-armv6l.tar.gz
    sudo tar -C /usr/local -xzf go1.20.linux-armv6l.tar.gz
    export PATH=/usr/local/go/bin:$PATH
    
    # 2. 验证引导编译器
    go version
    # 应输出类似:go version go1.20 linux/arm
    
  2. 获取最新 Go 源码并编译: 使用 Git 克隆 Go 的源码仓库,切换到最新的稳定分支(如 go1.22),然后进行编译。

    # 1. 克隆源码 (或下载源码包)
    git clone https://go.googlesource.com/go
    cd go
    # 切换到最新的稳定分支,例如 go1.22
    git checkout go1.22
    
    # 2. 进入 src 目录并开始编译
    cd src
    ./make.bash
    # 或者使用 ./all.bash 进行完整编译和测试(耗时更长)
    
  3. 使用新编译的 Go: 编译完成后,上一级目录(即 go 目录)就是一个完整的 Go 发行版。

    # 假设你的工作目录是 /home/pi
    # 编译后的 Go 位于 /home/pi/go
    export GOROOT=/home/pi/go
    export PATH=$GOROOT/bin:$PATH
    
    # 验证新版本
    go version
    # 应输出类似:go version go1.22 linux/arm
    

方案二:在其他架构机器上交叉编译 ARMv7 的 Go 工具链

如果你有一台 x86_64 的 Linux 或 macOS 机器,可以在这台机器上为 ARMv7 交叉编译整个 Go 工具链。这需要你从源码构建。

操作步骤 (在 x86_64 Linux 主机上):

  1. 获取源码并设置引导编译器: 你的 x86_64 主机上需要有一个现成的 Go 环境(用于引导编译)。

    # 1. 安装主机本身的 Go (例如通过包管理器或官方下载)
    # 2. 克隆源码
    git clone https://go.googlesource.com/go
    cd go
    git checkout go1.22
    
  2. 执行交叉编译: 在 src 目录下,设置 GOOSGOARCH 环境变量,然后运行编译脚本。

    cd src
    # 设置编译目标为 Linux ARMv7 (ARM 32位)
    GOOS=linux
    GOARCH=arm
    GOARM=7 # 指定 ARMv7
    
    # 开始编译
    ./make.bash
    
  3. 获取编译结果: 编译完成后,../ 目录下会生成一个针对 linux/arm 的 Go 工具链。你可以将这个 go 目录打包,复制到你的 ARMv7 设备上使用。

    # 在 x86_64 主机上打包
    cd ..
    tar czf go.linux-armv7.tar.gz go/
    # 然后将此压缩包传到 ARMv7 设备上解压并设置 GOROOT/PATH 即可
    

关键点说明

  • GOARM 环境变量:当 GOARCH=arm 时,GOARM 用于指定 ARM 的版本(如 5, 6, 7)。GOARM=7 表示生成针对 ARMv7 的代码,会使用硬件浮点运算等高级指令以获得更好性能。
  • 官方支持状态:Go 编译器本身仍然支持生成 ARMv7 代码。停止的只是预编译的二进制分发版的下载。社区维护的发行版(如 golang/dl)未来也可能提供非官方构建。
  • 运行现有程序:已经编译好的、针对 linux/arm 的 Go 应用程序,在 ARMv7 设备上仍然可以正常运行,不受工具链下载变化的影响。

示例:验证一个简单程序在 ARMv7 上的编译和运行

在你的 ARMv7 设备上,使用新编译的 Go 工具链:

// hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, ARMv7!")
}

编译并运行:

# 确保 PATH 指向了你新编译的 Go
go build hello.go
file hello
# 输出应显示:hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, ...
./hello
# 输出:Hello, ARMv7!

总之,虽然官方下载页面不再直接提供 linux-armv6l.tar.gz(它兼容 armv7),但通过从源码编译,你可以获得完全支持 ARMv7 的最新版 Go 工具链。方案一在目标设备上直接编译是最可靠的路径。

回到顶部