深入了解 Golang 多架构编译:交叉编译最佳实践

在这里插入图片描述

随着软件开发领域的不断发展,我们面临着越来越多的挑战,其中之一是如何在不同的平台和架构上部署我们的应用程序。Golang(Go)作为一种现代化的编程语言,具有出色的跨平台支持,通过其强大的多架构编译功能,可以轻松实现在各种操作系统和硬件架构上的部署。本文将深入探讨 Golang 多架构编译的原理、方法以及示例。

1. Golang 多架构编译的原理

Golang 的多架构编译功能依赖于两个关键的环境变量:GOOSGOARCH。其中,GOOS 表示目标操作系统,而 GOARCH 表示目标架构。通过设置这两个环境变量,我们可以告诉 Go 编译器在编译过程中要生成的目标平台。

2. 如何进行 Golang 多架构编译

  1. 设置环境变量:在开始编译之前,首先需要设置 GOOSGOARCH 环境变量。例如,要为 Linux 64 位编译,可以使用命令 export GOOS=linuxexport GOARCH=amd64

  2. 编写代码:准备好你的 Go 代码,例如一个简单的 main.go 文件,其中包含了你的应用程序逻辑。

  3. 进行编译:使用 go build 命令进行编译,同时指定目标操作系统和架构。例如,要在 CentOS amd64 上为 Linux 64 位编译,可以使用命令 GOOS=linux GOARCH=amd64 go build -o hello-linux-amd64 main.go

  4. 验证编译结果:编译完成后,可以验证生成的可执行文件是否能够在目标平台上正常运行。

3. 最佳实践

3.1 多架构编译

以下是一个示例,你可以使用环境变量 GOOS 和 GOARCH 来为不同的平台编译你的程序,并生成适用于不同操作系统和架构的可执行文件。

package mainimport "fmt"func main() {fmt.Println("Hello, World!")
}

使用以下命令,我们可以将这个简单的 Go 程序编译为多个目标平台的可执行文件:

# 编译为 Linux 64 位可执行文件
GOOS=linux GOARCH=amd64 go build -o hello-linux-amd64 main.go# 编译为 Windows 64 位可执行文件
GOOS=windows GOARCH=amd64 go build -o hello-windows-amd64.exe main.go# 编译为 ARM 64 位可执行文件
GOOS=linux GOARCH=arm64 go build -o hello-linux-arm64 main.go# 编译为 macOS 64 位可执行文件
GOOS=darwin GOARCH=amd64 go build -o hello-darwin-amd64 main.go

通过以上命令,我们可以在不同的操作系统和架构上编译出相应的可执行文件,使得我们的应用程序能够在各种环境中运行。

3.2 编写多架构编译脚本

为了方便编译多个架构,可以编写一个脚本来自动编译多个目标平台。

创建 build.sh 脚本:

#!/bin/bashOUTPUT_DIR="build"
PLATFORMS=("linux/amd64" "linux/arm64" "windows/amd64" "darwin/amd64")mkdir -p $OUTPUT_DIRfor PLATFORM in "${PLATFORMS[@]}"; doOS=$(echo $PLATFORM | cut -d'/' -f1)ARCH=$(echo $PLATFORM | cut -d'/' -f2)OUTPUT_NAME=$OUTPUT_DIR/hello-$OS-$ARCHif [ $OS = "windows" ]; thenOUTPUT_NAME+='.exe'fiecho "Building for $OS/$ARCH..."GOOS=$OS GOARCH=$ARCH go build -o $OUTPUT_NAME main.go
done

使脚本可执行:

chmod +x build.sh

运行脚本:

./build.sh

这个脚本会在 build 目录中生成多个目标平台的可执行文件。

3.3 安装和使用交叉编译工具链

对于一些架构,例如 ARM,你可能需要安装特定的交叉编译工具链。例如:在 CentOS X86 架构的环境上,编译 ARM 架构的应用。

目前,CentOS 官方仓库不直接提供 gcc-arm-linux-gnu 和 gcc-aarch64-linux-gnu 包。因此,我们可以从开发者网站(如 ARM 官方或 Linaro)下载预编译的工具链。下面示例展示如何安装 Linaro 提供的 ARM 工具链。

  1. 下载 Linaro 64 位 ARM 工具链

    wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
    
  2. 解压并安装工具链

    sudo tar -C /usr/local -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
    
  3. 将工具链添加到系统环境变量

     echo "export PATH=\$PATH:/usr/local/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin" >> ~/.bashrc source ~/.bashrc   
    
  4. 验证工具链安装

    安装完成后,可以通过以下命令验证工具链是否安装成功。

    aarch64-linux-gnu-gcc --version
    
  5. 使用 ARM 工具链进行交叉编译

    安装完成并验证工具链后,你可以使用这些工具链为 ARM 平台进行交叉编译。例如:

    GOARCH=arm64 GOOS=linux CC=aarch64-linux-gnu-gcc go build -o hello-arm64 main.go
    

通过这些步骤,你可以在 CentOS 7 amd64 上安装 ARM 工具链,并为 ARM 平台进行交叉编译。

3.4 使用 Docker 进行多架构编译

Docker 提供了一种方便的方法来进行多平台构建。你可以使用 Docker 的 Buildx 插件来构建不同平台的 Docker 镜像。

  1. 安装 Docker 和 Buildx

    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum install docker-ce docker-ce-cli containerd.iosudo systemctl start docker
    sudo systemctl enable docker# 启用 Buildx
    docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    docker buildx create --use
    
  2. 创建 Dockerfile

    创建一个简单的 Dockerfile:

    # 使用多阶段构建
    FROM golang:1.18 AS builderWORKDIR /appCOPY . .RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /hello# 创建最终镜像
    FROM alpine:latestCOPY --from=builder /hello /helloCMD ["/hello"]
    
  3. 构建多平台 Docker 镜像

    docker buildx build --platform linux/amd64,linux/arm64 -t hello:latest --push .
    

4. 结语

通过这篇文章,读者可以全面了解 Golang 的多架构编译功能,掌握如何使用这一功能来实现跨平台部署。同时,通过最佳实践示例,读者可以更加直观地理解 Golang 多架构编译的实际应用场景,为日后的开发工作提供参考和指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/332455.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络模型-NQA与网络协议联动

一、NQA定义 网络质量分析NQA(Network QualityAnalysis)是一种实时的网络性能探测和统计技术,可以对响应时间、网络抖动、丢包率等网络信息进行统计。NOA能够实时监视网络0oS,在网络发生故障时进行有效的故障诊断和定位。 部署IPv4静态路由与BFD…

【Text2SQL 经典模型】TypeSQL

论文:TypeSQL: Knowledge-Based Type-Aware Neural Text-to-SQL Generation ⭐⭐⭐ Code: TypeSQL | GitHub 一、论文速读 本论文是在 SQLNet 网络上做的改进,其思路也是先预先构建一个 SQL sketch,然后再填充 slots 从而生成 SQL。 论文发…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案

随着越来越多用户使用 DolphinDB,各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来,以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …

浅谈Docker容器的网络通信原理

文章目录 1、回顾容器概念2、容器网络3、容器与主机之间的网络连通4、交换机的虚拟实现---虚拟网桥(Bridge)5、Docker 守护进程daemon管理容器网络 1、回顾容器概念 我们知道容器允许我们在同一台宿主机(电脑)上运行多个服务&…

【UE数字孪生学习笔记】 使用DataSmith对模型快速导入 UE5.3.2使用unreal DataSmith文件

声明:部分内容来自于b站,慕课,公开课等的课件,仅供学习使用。如有问题,请联系删除。 部分内容来自UE官方文档,博客等 UE5.3.2使用 3D Max 导出的unreal DataSmith文件 1. 去UE官网下载DataSmith导出器并导…

Wpf 使用 Prism 实战开发Day25

首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 1.AddMemoViewModel 逻辑处理类,添加View视图数据要绑定的实体类 Model public class AddMemoViewModel :BindableBase,IDialogHostAware{public AddMemoV…

代码随想录-Day20

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…

[杂项]优化AMD显卡对DX9游戏(天谕)的支持

目录 关键词平台说明背景RDNA 1、2、3 架构的显卡支持游戏一、 优化方法1.1 下载 二、 举个栗子(以《天谕》为例)2.1 下载微星 afterburner 软件 查看游戏内信息(可跳过)2.2 查看D3D9 帧数2.3 关闭游戏,替换 dll 文件2…

DBAPI怎么进行数据格式转换

DBAPI如何进行数据格式的转换 假设现在有个API,根据学生id查询学生信息,访问API查看数据格式如下 {"data":[{"name":"Michale","phone_number":null,"id":77,"age":55}],"msg"…

AIGC-常见图像质量评估MSE、PSNR、SSIM、LPIPS、FID、CSFD,余弦相似度----理论+代码

持续更新和补充中…多多交流! 参考: 图像评价指标PNSR和SSIM 函数 structural_similarity 图片相似度计算方法总结 MSE和PSNR MSE: M S E 1 m n ∑ i 0 m − 1 ∑ j 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 MSE\frac{1}{mn}\sum_{i0}^{m-1}\sum_{j0}^{n-1}[…

车载电子电器架构 —— 应用软件开发(下)

车载电子电器架构 —— 应用软件开发(下) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证…

【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)

基于FastadminThinkPHP和Uniapp开发的赛事报名系统,包含个人报名和团队报名、成绩查询、成绩证书等。 构建高效便捷的赛事参与平台 一、引言:赛事报名系统的重要性 在举办各类赛事时,一个高效便捷的报名系统对于组织者和参与者来说都至关重…

全域运营是本地生活的下半场?新的创业风口来了?

随着全域概念的兴起,全域运营赛道也逐渐进入人们的视野之中,甚至有业内人士预测,全域运营将会是本地生活下半场的大趋势。 之所以这么说,是因为全域运营作为包含了公域和私域内所有运营业务的新模式,不仅能同时做所有本…

仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码

码名称:仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码 开发环境:帝国cms7.5 空间支持:phpmysql 仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码自动采集 - 我爱模板网源码名称:仿《Q极速体育》NBACBA体育直…

【已解决】在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。

文章目录 问题概述1、在Jupyter中GPU运行true2、在pycharm中GPU运行false3、个人解决方案仅供参考 问题概述 在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。原因在于jupyter 运行环境和pycharm 运行环境不同&#xf…

使用LoRA进行高效微调:基本原理

Using LoRA for efficient fine-tuning: Fundamental principles — ROCm Blogs (amd.com) [2106.09685] LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org) Parametrizations Tutorial — PyTorch Tutorials 2.3.0cu121 documentation 大型语言模型&#xf…

大模型应用:基于Golang实现GPT模型API调用

1.背景 当前OpenAI提供了开放接口,支持通过api的方式调用LLM进行文本推理、图片生成等能力,但目前官方只提供了Python SDK。为了后续更方便集成和应用,可以采用Golang对核心推理调用接口进行封装,提供模型调用能力。 2.相关准备…

MDK安装

MDK安装 1 MDK的差异2 切换MDK3 安装芯片支持包注意点 1 MDK的差异 不同版本MDK有略微的差别,比如:MDK536.EXE,支持版本5的交叉编译链。如下图所示: 而MDK539.EXE不支持版本5的交叉编译链,所以工作的时候&#xff0c…

方正畅享全媒体新闻采编系统 binary.do SQL注入漏洞复现

0x01 产品简介 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、发…

Docker提示某网络不存在如何解决,添加完网络之后如何删除?

Docker提示某网络不存在如何解决? 创建 Docker 网络 假设现在需要创建一个名为my-mysql-network的网络 docker network create my-mysql-network运行容器 创建网络之后,再运行 mysqld_exporter 容器。完整命令如下: docker run -d -p 9104…