电话+V:159999-78052 ,欢迎咨询go交叉编译调试,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]
实际应用中,Go语言的交叉编译和条件编译技术显得尤为重要。交叉编译是指在开发环境中使用特定的编译器工具链,生成能在其他平台(如Windows开发Linux运行)上运行的可执行文件。比如,GOOS和GOARCH环境变量可以帮助设置目标平台和架构,如config_linux_amd64.go会针对Linux64位架构进行编译。
条件编译则允许根据特定条件编译源码,这在不同环境下的配置管理中尤为实用。Go通过文件名命名规则和特殊注释(//+build)来实现。例如,通过_prod或_dev前缀区分生产与开发环境的配置文件,如config_prod.go和config_dev.go。在编译时,可以通过设置环境变量(如ldflags)或启动时指定配置文件来动态加载对应配置。
在实际项目中,商业项目通常需要考虑开发、测试、灰度等多个环境。通过启动参数、环境变量或条件编译,我们可以轻松地为每个环境定制不同的配置,确保程序在不同环境下表现一致。例如,使用自定义编译标签时,需确保GoLand设置正确,以避免识别错误。
由于多年前掀起了浪潮去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

程序代码如下:
打包部署交叉编译错误
由于部署的环境是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语言的一大优势在于其简便的交叉编译功能,允许开发者生成适用于不同硬件平台与操作系统的程序。本文将详细记录如何在小米路由器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版本,问题得到解决。
电话+V:159999-78052
机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。