golang 在 Mac , Linux , Windows 下交叉編譯詳解


一. 前言

Golang 支持交叉編譯, 在一個平台上生成然后再另外一個平台去執行。 而且編譯的工具【build】這個工具是Golang 內置的,不需要你去下載第三方的包啥的,賊方便。

二. 交叉編譯

Mac 下編譯, Linux 或者 Windows 下去執行

# linux 下去執行
CGO_ENABLED=0  GOOS=linux  GOARCH=amd64  go build main.go
# Windows 下去執行
CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go  build  main.go

Linux 下編譯 , Mac 或者 Windows 下去執行

# Mac  下去執行
CGO_ENABLED=0 GOOS=darwin  GOARCH=amd64  go build main.go
# Windows 下執行
CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go build main.go

Windows 下執行 , Mac 或 Linux 下去執行

需要寫一個批處理程序,在里面去設置,因為windows 下的 terminal 不支持shell , 這跟 Mac 和 Linux下的有點不同

# Mac 下執行
SET  CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go
# Linux 去執行
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go

參數說明

  • CGO_ENABLED : CGO 表示golang中的工具,CGO_ENABLED 表示CGO禁用,交叉編譯中不能使用CGO的
  • GOOS : 目標平台
    • mac 對應 darwin
    • linux 對應 linux
    • windows 對應 windows
  • GOARCH :目標平台的體系架構【386,amd64,arm】, 目前市面上的個人電腦一般都是amd64架構的
    • 386 也稱 x86 對應 32位操作系統
    • amd64 也稱 x64 對應 64位操作系統
    • arm 這種架構一般用於嵌入式開發。 比如 Android , IOS , Win mobile , TIZEN 等

linux 或者 Mac下 go build 前面的參數為何需要那樣設置?

go env 可以列出我們的golang 默認環境變量,在shell中當我們只想一次性更改其環境變量時,就可以通過在shell中設置變量的方式來更改這個環境變量。

三. 案例分析

查看默認值

>#go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/data/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
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 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build171002917=/tmp/go-build -gno-record-gcc-switches"
>#

更改

>#CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go env
GOARCH="amd64"  # 變更了
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=".exe"
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="windows" #  變更了
GOPATH="/data/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="0"  # 變更了
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-m64 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build668031908=/tmp/go-build -gno-record-gcc-switches"
>#

查看更改后的值

>#go env
GOARCH="amd64" # 還原了
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"      # 默認值
GOPATH="/data/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
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 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build240557259=/tmp/go-build -gno-record-gcc-switches"
>#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM