Go 语言交叉编译在 openwrt 上运行的程序
发布网友
发布时间:2024-10-08 17:00
我来回答
共1个回答
热心网友
时间:2024-10-17 18:37
Go 语言的一大优势在于其简便的交叉编译功能,允许开发者生成适用于不同硬件平台与操作系统的程序。本文将详细记录如何在小米路由器 3G 上运行 Go 语言编写的程序,以供参考。
编译环境为 macOS 以及 Go 1.11 版本,目标运行环境为基于 OpenWRT 的路由器,其采用 MIPS 架构的 32 位处理器 MT7621,配置双核四线程,无浮点单元(FPU)。代码文件命名为 `hello.go`。
编译过程采用标准的 `go build` 命令,只需通过 `GOOS` 和 `GOARCH` 参数指定目标平台的操作系统与 CPU 架构。由于 MT7621 无 FPU,因此在编译时需特别指定使用 `softfloat` 软浮点,以确保程序中不包含浮点计算指令,避免非法指令错误。
在较早版本的 Go 需要借助第三方库实现 MIPS 平台的交叉编译,但 Go 1.11 版本已内置了对 MIPS 平台的支持,无需额外依赖。对于无 FPU 的处理器,可以通过在编译 OpenWRT 时打开内核的浮点模拟器来实现兼容性,但使用 `GOMIPS=softfloat` 指令同样能够满足需求。
编译完成后,通过 `scp` 命令将生成的可执行文件 `hello` 传输至目标平台并运行。程序执行一切正常,已成功在路由器上部署 Go 语言程序。
在编译过程中遇到的两个关键问题包括:
1. **Go 1.11 版本编译缓存问题**:在切换 `GOMIPS=softfloat` 与 `hardfloat` 时,编译结果并未变化,需手动清理缓存以获取正确的输出。通过在 GitHub 上查找对应 issue,并确认其已被修复后,更新至 Go 1.11.5 版本,问题得到解决。
2. **GOARCH 参数配置问题**:初始时将 `GOARCH` 设置为 `mips`,即 MIPS 处理器的大端架构,导致编译出的程序在执行时出现语法错误。经调查,`GOARCH` 参数可以设置为 `mips` 或 `mipsle`,分别对应大小端架构。考虑到 MT7621 为小端架构,修正 `GOARCH` 为 `mipsle` 后问题得以解决。
Go 语言交叉编译在 openwrt 上运行的程序
编译环境为 macOS 以及 Go 1.11 版本,目标运行环境为基于 OpenWRT 的路由器,其采用 MIPS 架构的 32 位处理器 MT7621,配置双核四线程,无浮点单元(FPU)。代码文件命名为 `hello.go`。编译过程采用标准的 `go build` 命令,只需通过 `GOOS` 和 `GOARCH` 参数指定目标平台的操作系统与 CPU ...
Load Port、SMIF
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...
Go语言涉及CGO的交叉编译(跨平台编译)解决办法
在交叉编译中,GOOS和GOARCH用于指定构建的目标平台,通常选择Linux。在编译选项中,-ldflags参数用于定制编译指令。若项目中包含CGO,首先需要确保CGO_ENABLED保持开启状态。此时,我们需借助辅助编译工具来实现交叉编译。对于Mac平台,可以使用工具FiloSottile/musl-cross/musl-cross,通过brew安装后即可使用。...
openWRT 交叉编译程序 ./hello: line 1: syntax error: unexpected...
100 【*】下载的是svncosvn://svn.openwrt.org/openwrt/trunk/版本的源码;【*】在makemenuconfig时,仅增加勾选了SDK和toolchain两项;之后makeV=99;并编译成功;【*】在源码路径下的sta... 展开 我来答 分享 你的回答被采纳后将获得: 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者...
Go交叉编译
1. 首先,确保Go环境变量已正确配置。可以利用`env`命令查看环境变量设置情况。如果未配置,可以通过将Go安装路径添加到系统或用户的环境变量中来完成。这一步对于后续的编译操作至关重要。2. 在命令行窗口中,使用PowerShell进行编译操作更为方便。打开PowerShell窗口,输入以下命令以完成编译过程:`go bui...
为openwrt添加的自己的软件包时到package目录下时,发现里面已有的程序...
交叉编译的gcc是不一样,虽然都是gcc,但是编译出来的东西是不一样的。
如何为现有的openwrt编译一个opkg上没有的软件
svn checkout svn://svn.openwrt.org/openwrt/backfire cd backfire ./scripts/feeds update -a ./scripts/feeds install -a 4.配置编译选项 make menuconfig 在target system里选择Broadcom BCM63xx,根据需要选择其他的软件,:表示该模块直接编译到核心中 M:该模块以被核心支持,可以后再安装 空白...
golang交叉编译和条件编译的实际应用
实际应用中,Go语言的交叉编译和条件编译技术显得尤为重要。交叉编译是指在开发环境中使用特定的编译器工具链,生成能在其他平台(如Windows开发Linux运行)上运行的可执行文件。比如,GOOS和GOARCH环境变量可以帮助设置目标平台和架构,如config_linux_amd64.go会针对Linux 64位架构进行编译。条件编译则允许...
初探AC2100 刷 openwrt
系统版本:刷完之后想知道一下系统版本,通过下面的命令看到OPENWRT_ARCH="mipsel_24kc",查询之后这是一个32位mipsel架构的系统。我们可以在go里面写了一个Hello World交叉编译之后直接扔到路由器就能跑,非常容易,go语言太强大了。写完代码后,使用交叉编译的命令使用的是$GOOS=linux GOARCH=mipsle ...
...可以像锐捷一样交叉编译进openwrt吗(源码用zlevenoc
有源码就可以,交叉编译和一般的编译,没有什么本质的不同。
linux下怎么安装Go开发环境
编译并运行一个简单的程序,首先选择一个包的路径(我们将使用github.com/user/hello)和创建在您的工作区相应的软件包目录:mkdir $GOPATH/src/github.com/user/hello创建名叫hello.go的文件,上面创建过,此处略过。cd $GOPATH/src/github.com/user/hellogo install$GOPATH/bin/hello或者:hello如果你使用的是一个...