GoLang跨平台编译ARMv7l程序(路由器)就这么简单

GoLang跨平台编译ARMv7l程序(路由器)就这么简单

GoLang跨平台编译就这么简单

本示例介绍的是Linux操作系统下操作过程,Mac与Windows版本操作过程基本一致,只需要安装包和具体命令与对应系统类型一致就可以了。

接下来就是具体的操作步骤:
1. 安装GoLang编译器。
2. 编译跨平台版本可执行程序

安装GoLang编译器

下载官方提供的GoLang二进制包(大小:129M)

mkdir ~/GoLang/
cd ~/GoLang/ && wget -c https://golang.org/dl/go1.17.linux-amd64.tar.gz && tar zxvf go1.17.linux-amd64.tar.gz

# 设置环境变量PATH,
export PATH=$PATH:~/GoLang/go/bin

测试GoLang编译器可用:

$ go version
go version go1.17 linux/amd64

设置完成默认的GoLang编译器。

编译跨平台版本可执行程序

我们以斐逊K3路由器Armv7l类型作为编译目标系统。

新建一个代码示例:

mkdir hello
cd hello
go mod init example.com/user/hello

新建一个hello.go文件,内容如下:

package main

import "fmt"

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

编译hello.go代码(Armv7l类型编译选项设置 GOARCH=arm GOARM=5):

GOARCH=arm GOARM=5 go build

此时,可以在当前目录下看到新生成的hello可执行程序,将这个程序传输到路由器的/tmp目录:

scp ./hello router:/tmp

登录到路由器并执行hello程序,测试执行结果如下说明正常运行:

$ /tmp/hello
[email protected]:/jffs/scripts# /tmp/hello
Hello, world.

如果遇到显示“illegal instruction”这样的信息,说明编译目标架构不符合路由器实际的架构类型,需要调整到正确的选项再重新编译。

到这里,我们已经成功完成了GoLang语言的跨平台编译过程,是不是很简单。

更多平台参数信息如下:

$GOOS $GOARCH
aix ppc64
android 386
android amd64
android arm
android arm64
darwin amd64
darwin arm64
dragonfly amd64
freebsd 386
freebsd amd64
freebsd arm
illumos amd64
ios arm64
js wasm
linux 386
linux amd64
linux arm
linux arm64
linux ppc64
linux ppc64le
linux mips
linux mipsle
linux mips64
linux mips64le
linux riscv64
linux s390x
netbsd 386
netbsd amd64
netbsd arm
openbsd 386
openbsd amd64
openbsd arm
openbsd arm64
plan9 386
plan9 amd64
plan9 arm
solaris amd64
windows 386
windows amd64
windows arm
windows arm64
  • $GOARM(仅适用arm;如果在目标处理器上构建,则默认为自动检测,否则为 6)
    这将设置运行时应定位的 ARM 浮点协处理器架构版本。如果您在目标系统上进行编译,则会自动检测其值。
    • GOARM=5:使用软件浮点;当 CPU 没有 VFP 协处理器时
    • GOARM=6:仅使用 VFPv1;交叉编译时默认;通常是 ARM11 或更好的内核(也支持 VFPv2 或更好的内核)
    • GOARM=7:使用 VFPv3;通常是 Cortex-A 内核.

那么,怎么确定你的ARM处理器支持VFP功能呢?很简单,使用下面这条命令来查看CPU支持VFP:

 [email protected] $ grep -i vfp /proc/cpuinfo
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32

可以确定,树莓派3支持VFPi的。编译时可以使用GOARM=7选项。

对于某些路由器,虽然uname -m显示的是armv7l但可能是不支持VFP的,因此只能使用GOARM=5选项啦。

更多编译选项信息 源码编译选项信息

转载本文时请注明出处及本文链接地址GoLang跨平台编译ARMv7l程序(路由器)就这么简单

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注