如何在windows平台将golang应用交叉编译后运行在linux平台

如何在windows平台将golang应用交叉编译后运行在linux平台

前言:其实我一直没有遇到过交叉编译的问题,因为我只用的mac本的环境和linux一致,最近在项目中其他同学的问题中了解到这个,所以输出自己的见解希望能给初学者一些帮助。

交叉编译

什么是交叉编译?

  • 交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

  • 举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。

使用交叉编译流程

1.创建一个go项目 main文件

package main

import "fmt"

func main() {
	fmt.Println("测试交叉编译功能!!!")
}

2.查看自己的go env

  • 调出下面的终端,输入go env回车

    GO111MODULE="on"
    GOARCH="amd64"
    GOBIN="/usr/local/go/bin"
    GOCACHE="/Users/apple/Library/Caches/go-build"
    GOENV="/Users/apple/Library/Application Support/go/env"
    GOEXE=""
    GOEXPERIMENT=""
    GOFLAGS=""
    GOHOSTARCH="arm64"
    GOHOSTOS="darwin"
    GOINSECURE=""
    GOMODCACHE="/Users/apple/Documents/go项目/docker部署/pkg/mod"
    GONOPROXY=""
    GONOSUMDB=""
    GOOS="windows"
    GOPATH="/Users/apple/Documents/go项目/docker部署:/Users/apple/Documents/go项目/The project of actual combat"
    GOPRIVATE=""
    GOPROXY="https://goproxy.cn,direct"
    GOROOT="/usr/local/go"
    GOSUMDB="sum.golang.org"
    GOTMPDIR=""
    GOTOOLDIR="/usr/local/go/pkg/tool/darwin_arm64"
    GOVCS=""
    GOVERSION="go1.17.9"
    GCCGO="gccgo"
    AR="ar"
    CC="clang"
    CXX="clang++"
    CGO_ENABLED="0"
    GOMOD="/Users/apple/Documents/Crisp_to_go/go _demo/go.mod"
    CGO_CFLAGS="-g -O2"
    CGO_CPPFLAGS=""
    CGO_CXXFLAGS="-g -O2"
    CGO_FFLAGS="-g -O2"
    CGO_LDFLAGS="-g -O2"
    PKG_CONFIG="pkg-config"
    GOGCCFLAGS="-fPIC -m64 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/cf/y665m93120scly0mwqqgmhhw0000gn/T/go-build3778726472=/tmp/go-build -gno-record-gcc-switches"
    
  • 上面这个环境变量是windows中的,我们需要改变相关的配置,让这个程序在linux系统中也可以执行

3.修改环境变量

go env -w GOOS="linux"
go env -w GOARCH="amd64"

4.重新查看环境变量,查看是否修改成功

  • 在终端输入go env 查看变量

    GO111MODULE="on"
    GOARCH="amd64"
    GOBIN="/usr/local/go/bin"
    GOCACHE="/Users/apple/Library/Caches/go-build"
    GOENV="/Users/apple/Library/Application Support/go/env"
    GOEXE=""
    GOEXPERIMENT=""
    GOFLAGS=""
    GOHOSTARCH="arm64"
    GOHOSTOS="darwin"
    GOINSECURE=""
    GOMODCACHE="/Users/apple/Documents/go项目/docker部署/pkg/mod"
    GONOPROXY=""
    GONOSUMDB=""
    GOOS="linux"             //此处可以看出修改成功
    GOPATH="/Users/apple/Documents/go项目/docker部署:/Users/apple/Documents/go项目/The project of actual combat"
    GOPRIVATE=""
    GOPROXY="https://goproxy.cn,direct"
    GOROOT="/usr/local/go"
    GOSUMDB="sum.golang.org"
    GOTMPDIR=""
    GOTOOLDIR="/usr/local/go/pkg/tool/darwin_arm64"
    GOVCS=""
    GOVERSION="go1.17.9"
    GCCGO="gccgo"
    AR="ar"
    CC="clang"
    CXX="clang++"
    CGO_ENABLED="0"
    GOMOD="/Users/apple/Documents/Crisp_to_go/go _demo/go.mod"
    CGO_CFLAGS="-g -O2"
    CGO_CPPFLAGS=""
    CGO_CXXFLAGS="-g -O2"
    CGO_FFLAGS="-g -O2"
    CGO_LDFLAGS="-g -O2"
    PKG_CONFIG="pkg-config"
    GOGCCFLAGS="-fPIC -m64 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/cf/y665m93120scly0mwqqgmhhw0000gn/T/go-build3778726472=/tmp/go-build -gno-record-gcc-switches"
    
  • 可以通过GOOS="linux" GOARCH="amd64"是否修改

5.使用go build main.go编译main.go

go build main.go
  • 会生成一个main的可执行文件(想小电视的那个)

    image-20220721143831751

6.将main文件上传到linux环境下

  • 上传的位置大家可以自己来定,我在我的服务器中有一个project文件夹,我一般放在这里面。没有固定地方,大家看自己的心情即可。

7.修改main的执行权限的

  • 我们上传的main文件没有执行的权限,需要给这个文件一个执行权限

    //赋予main文件执行的权限
    chmod +x ./main
    

8.运行程序

//执行程序
./main

9.运行结果

测试交叉编译功能!!!

结语

希望我的博客能给你带来一点点收获

拜拜👋,下篇博客见!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值