如何在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的可执行文件(想小电视的那个)
6.将main文件上传到linux环境下
- 上传的位置大家可以自己来定,我在我的服务器中有一个project文件夹,我一般放在这里面。没有固定地方,大家看自己的心情即可。
7.修改main的执行权限的
-
我们上传的main文件没有执行的权限,需要给这个文件一个执行权限
//赋予main文件执行的权限 chmod +x ./main
8.运行程序
//执行程序
./main
9.运行结果
测试交叉编译功能!!!
结语
希望我的博客能给你带来一点点收获
拜拜👋,下篇博客见!