当前位置: 首页 新闻详细

golang交叉编译和条件编译的实际应用,Go 语言交叉编译在 openwrt 上运行的程序

专业编程培训机构——完成蜕变以后轻松拿高薪

电话+V:159999-78052 ,欢迎咨询go交叉编译调试,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]

一、golang交叉编译和条件编译的实际应用

实际应用中,Go语言的交叉编译和条件编译技术显得尤为重要。交叉编译是指在开发环境中使用特定的编译器工具链,生成能在其他平台(如Windows开发Linux运行)上运行的可执行文件。比如,GOOS和GOARCH环境变量可以帮助设置目标平台和架构,如config_linux_amd64.go会针对Linux64位架构进行编译。

条件编译则允许根据特定条件编译源码,这在不同环境下的配置管理中尤为实用。Go通过文件名命名规则和特殊注释(//+build)来实现。例如,通过_prod或_dev前缀区分生产与开发环境的配置文件,如config_prod.go和config_dev.go。在编译时,可以通过设置环境变量(如ldflags)或启动时指定配置文件来动态加载对应配置。

在实际项目中,商业项目通常需要考虑开发、测试、灰度等多个环境。通过启动参数、环境变量或条件编译,我们可以轻松地为每个环境定制不同的配置,确保程序在不同环境下表现一致。例如,使用自定义编译标签时,需确保GoLand设置正确,以避免识别错误。

二、使用xgo解决oracle交叉编译

由于多年前掀起了浪潮去IOE,现在用Oracle数据库比较少,历史遗留的系统,部分老旧的系统采用了Oracle。用golang访问Oracle相对比较麻烦,特别部署系统采用交叉编译,踩了不少坑,本文将带您解决golang访问Oracle用xgo解决交叉编译的问题。

本机环境:ARM64处理器,Ubuntu22.04.2LTSArm版go1.21.0docker24.0.5

本机的Oracle客户端环境搭建。

golang访问Oracle,无论是开发环境还是生产环境,都需要安装Oracle的客户端。

3.1下载oracle客户端

Basic(.zip)

SQL*Plus(.zip)

SDK(.zip)

3.2配置环境变量。

将3个文件全部解压到instantclient_19_19文件夹下。

安装libaio1sudoaptinstalllibaio1将环境变量LD_LIBRARY_PATH设置为InstantClient版本的相应目录exportLD_LIBRARY_PATH=/opt/oracle/instantclient_19_19:$LD_LIBRARY_PATH

下载Oracle驱动包

gogethttp://github.com/godror/godror@latest

go交叉编译调试

程序代码如下:

打包部署交叉编译错误

由于部署的环境是x86linux所以执行命令GOOS=linuxGOARCH=amd64gobuild-ogoracmain.go结果出现错误

主要原因是使用了cgo

解决交叉编译使用xgo(x86结构芯片)

xgoGoCGO交叉编译器,可提供跨平台cgo编译,xgo详细使用请查看官网github.com/karalabe/xgo

1.docker容器安装(注意karalabe/xgo-latest镜像有几个G,下载时间较长)

2.本机下载xgo包

3.打包编译

支持的目标是:

Arm芯片使用xgo编译

由于cpu是arm芯片,使用xgo的时候会出错,好在有人在fork了xgo的分支,解决了arm的问题。github.com/crazy-max/xg...

1.安装

2.下载crazy-max/xgo

3.打包编译

三、Go语言交叉编译在openwrt上运行的程序

Go语言的一大优势在于其简便的交叉编译功能,允许开发者生成适用于不同硬件平台与操作系统的程序。本文将详细记录如何在小米路由器3G上运行Go语言编写的程序,以供参考。

编译环境为macOS以及Go1.11版本,目标运行环境为基于OpenWRT的路由器,其采用MIPS架构的32位处理器MT7621,配置双核四线程,无浮点单元(FPU)。代码文件命名为`hello.go`。

编译过程采用标准的`gobuild`命令,只需通过`GOOS`和`GOARCH`参数指定目标平台的操作系统与CPU架构。由于MT7621无FPU,因此在编译时需特别指定使用`softfloat`软浮点,以确保程序中不包含浮点计算指令,避免非法指令错误。

在较早版本的Go需要借助第三方库实现MIPS平台的交叉编译,但Go1.11版本已内置了对MIPS平台的支持,无需额外依赖。对于无FPU的处理器,可以通过在编译OpenWRT时打开内核的浮点模拟器来实现兼容性,但使用`GOMIPS=softfloat`指令同样能够满足需求。

编译完成后,通过`scp`命令将生成的可执行文件`hello`传输至目标平台并运行。程序执行一切正常,已成功在路由器上部署Go语言程序。

在编译过程中遇到的两个关键问题包括:

1.**Go1.11版本编译缓存问题**:在切换`GOMIPS=softfloat`与`hardfloat`时,编译结果并未变化,需手动清理缓存以获取正确的输出。通过在GitHub上查找对应issue,并确认其已被修复后,更新至Go1.11.5版本,问题得到解决。

【WINDRISES EMPLOYMENT PROGRAMMING】尊享对接老板

电话+V:159999-78052

机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。

go交叉编译调试
发布人:qq9875158710 发布时间:2024-10-23