如何在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

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"

3.修改环境变量

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

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

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"
go build main.go
go build main.go
  • 会生成一个main的可执行文件(想小电视的那个)

    image-20220721143831751

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

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

7.修改main的执行权限的

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

8.运行程序

//执行程序
./main

9.运行结果

测试交叉编译功能!!!

结语

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

拜拜👋,下篇博客见!