跨平台编译go(交叉编译)

这篇具有很好参考价值的文章主要介绍了跨平台编译go(交叉编译)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以将一个简单的go http 部署到docker为例!

方法一:构建service镜像同时拉取go镜像

Dockerfile文件

# alpine Linux发行版,该发行版的大小很小并且内置了Go
FROM golang:alpine

# 设置linux环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# 设置镜像内工作目录
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 将代码编译成二进制可执行文件app
RUN go build -o app .

# 移动到用于存放生成的二进制文件的 /dist 目录
WORKDIR /dist

# 将二进制文件从 /build 目录复制到/dist
RUN cp /build/app .

# 暴露端口
EXPOSE 8888

# 启动容器时运行的命令
CMD ["/dist/app"]

构建

  1. docker build . -t goweb_app
  2. docker run -p 8888:8888 goweb_app

方法二:分阶段构建,不保留源码文件和编译器

在最终的镜像中是不需要go编译器的,也就是说只需要一个运行最终二进制文件的容器即可。

FROM golang:alpine AS builder

# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# 移动到工作目录:/build
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 将我们的代码编译成二进制可执行文件 app
RUN go build -o app .

###################
# 接下来创建一个小镜像
###################
FROM scratch

# 从builder镜像中把/dist/app 拷贝到当前目录
COPY --from=builder /build/app /

# 需要运行的命令
ENTRYPOINT ["/app"]

方法三:本地跨平台编译后,丢到服务器

交叉编译(跨平台编译)

  1. Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序。
  2. golang中跨平台交叉编译涉及两个重要的环境变量:GOOS 和 GOARCH,分别代表 Target Host OS 和 Target Host ARCH。

比较重要的几个参数

GOARCH="amd64" // 程序构建环境的目标计算架构
GOOS="linux" // 程序构建环境的目标操作系统
CGO_ENABLED="1" // 指明cgo工具是否可用的标识

命令公式

CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go build -o ${name} main.go

  1. name:编译后app的名称,默认为gomod的包名

  2. os:目标os,大致有如下一堆:
    跨平台编译go(交叉编译)

  3. arch:架构

    跨平台编译go(交叉编译)

举例

  1. Mac 下编译 Linux 和 Windows 64位可执行程序:

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go​
    CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
    
  2. Linux 下编译 Mac 和 Windows 64位可执行程序:

    CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go​
    CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
    
  3. Windows 下编译 Mac 和 Linux 64位可执行程序:

    CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go​
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
    

提示:如果win命令行提示'CGO_ENABLED' 不是内部或外部命令,也不是可运行的程序 或批处理文件。可以用git bash去编译。

加执行权限,chmod +x web,然后执行,访问页面。(嫌开放端口之类的麻烦就把防火墙禁掉)
跨平台编译go(交叉编译)
跨平台编译go(交叉编译)文章来源地址https://www.toymoban.com/news/detail-467692.html

到了这里,关于跨平台编译go(交叉编译)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT+QGIS跨平台编译】之七:【libjpeg+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    libjpeg是一个广泛使用的jpeg图像压缩和解压的函数库,采用 C 语言开发。 2013年1月,Independent JPEG Group发布了版本9,对新引入的无损编码模式进行了改进。2022年1月,发布了版本9e,是唯一真正的源参考JPEG编解码器。 【libjpeg跨平台编译】:Windows环境下编译成果(支撑QGIS跨平台

    2024年01月25日
    浏览(66)
  • 【QT+QGIS跨平台编译】之八:【zstd+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    【libzstd跨平台编译】:Windows环境下编译成果(支撑QGIS跨平台编译,以及二次研发) 【libzstd跨平台编译】ÿ

    2024年01月25日
    浏览(99)
  • 【QT+QGIS跨平台编译】之五:【curl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    (libcurl编译,依赖OpenSSL、libSSH2等库) curl(CommandLine Uniform Resource Locator)主要功能就是用不同的协议连接和沟通不同的服务器,相当封装了的socket。 libcurl支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可

    2024年01月23日
    浏览(74)
  • 【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它

    2024年01月22日
    浏览(65)
  • 【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    RasterLite2是一个开源的轻量级栅格数据库,可以用于存储和管理各种类型的栅格数据,包括卫星遥感图像、数字高程模型等。 与传统的GIS数据存储方式不同,RasterLite2采用基于SQLite的数据库引擎,支持快速的数据查询和空间分析操作。同时,由于其轻量级的设计,RasterLite2可以

    2024年02月19日
    浏览(70)
  • Docker多平台、跨平台编译打包

    大多数带有Docker官方标识的镜像都提供了多架构支持。如:busybox镜像支持 amd64 ,  arm32v5 ,  arm32v6 ,  arm32v7 ,  arm64v8 ,  i386 ,  ppc64le , and  s390x。 当你在amd64设备上运行容器时,会拉取amd64镜像。 当你需要构建多平台镜像时,可以用 --platform 参数指定目标平台,但是通常情况下

    2024年02月06日
    浏览(68)
  • ffmpeg跨平台arm编译-ubuntu

    32位系统: 64位系统: 关键选项: –arch=arm:指定ARM平台 –target-os=linux:指定Linux系统 –enable-cross-compile :指定交叉编译 –cross-prefix=arm-linux-gnueabihf-:指定交叉编译链 如果是64位系统: –arch=aarch64:指定ARM平台 –cross-prefix=aarch64-linux-gnu-:指定交叉编译链

    2024年02月08日
    浏览(61)
  • rust包跨平台编译,macbook ,linux

    在 MacBook 上编译 Rust 项目并生成 Linux 包需要一些步骤。以下是一般的步骤概述: 1. **安装所需工具:**    首先,确保您的 MacBook 上已经安装了所需的工具。您需要 Rust 编程语言的工具链以及一些用于交叉编译到 Linux 的工具。    - 安装 Rust 工具链:您可以在终端中运行以下

    2024年02月12日
    浏览(56)
  • Go 跨平台GUI框架fyne 中文文档1 开始

    Fyne (go 跨平台 GUI ) 入门中文文档1开始 hello word A simple app starts by creating an app instance with app.New() and then opening a window with app.NewWindow(). Then a widget tree is defined that is set as the main content with SetContent() on a window. The app UI is then shown by calling ShowAndRun() on the window. 一个简单的应用程序首先

    2024年02月13日
    浏览(47)
  • 在Linux、Ubuntu中跨平台编译ARM(AARCH64)平台的binutils

    Binutils 是GNU(https://www.gnu.org/)提供的一组二进制工具的集合。通常,在已经安装了Linux操作系统的个人电脑上,系统就已经自带了这个工具集。但在进行嵌入式开发的时候,可能会用到支持ARM64平台的Binutils,这时就需要用到交叉编译。 此前,在【1】我们已经介绍过Ubuntu中交

    2024年02月05日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包