跨平台编译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,大致有如下一堆:
    在这里插入图片描述

  3. arch:架构

    在这里插入图片描述

举例

  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,然后执行,访问页面。(嫌开放端口之类的麻烦就把防火墙禁掉)
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
跨平台交叉编译是指在一个平台上编译生成在另一个不同平台上运行的可执行文件。对于使用 GCC 编译器进行跨平台交叉编译,你需要使用交叉编译工具链。 以下是一个简单的示例,演示如何使用 GCC 进行跨平台交叉编译: 1. 首先,你需要获取适用于目标平台的交叉编译工具链。这个工具链包含了适用于目标平台的编译器、库以及其他必要的工具。一般来说,你可以从交叉编译工具链的官方网站下载。 2. 安装交叉编译工具链,并确保将其添加到环境变量中。这样,你就能够在命令行中使用交叉编译工具链。 3. 现在,你可以使用交叉编译工具链来编译你的程序。假设你想将程序编译为在 ARM 架构上运行的可执行文件。使用以下命令: ``` $ arm-linux-gnueabi-gcc -o output_file input_file.c ``` 这里的 "arm-linux-gnueabi-gcc" 是交叉编译工具链提供的 GCC 编译器。"-o output_file" 指定了生成的可执行文件的输出路径和名称。"input_file.c" 是你要编译的源代码文件。 4. 执行以上命令后,GCC 将使用交叉编译工具链来生成适用于 ARM 架构的可执行文件。你可以将该可执行文件复制到目标平台上,并在目标平台上运行它。 请注意,跨平台交叉编译可能会涉及到一些特定的配置和参数,具体取决于你使用的工具链和目标平台。因此,建议你参考相关的文档和指南,以确保正确地进行跨平台交叉编译

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Generalzy

倍感荣幸文章对您有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值