一. 前言

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"
>#

最新文章

  1. PostgreSQL-pg_dump,pg_restore
  2. WinForm------TextEdit只能输入数字
  3. 解析 Linux 内核可装载模块的版本检查机制
  4. android Notification和NotificationManager的使用
  5. Spring优势
  6. Esper系列(三)Context和Group by
  7. Java ==,equals() 和hashCode
  8. Android深入浅出之 AudioTrack分析
  9. angular 过滤排序
  10. UIScrollView UIPageViewControlle…
  11. 面向对象___str__和__repr__
  12. 常见mysql的慢查询优化方式
  13. 别人的Linux私房菜(18)认识系统服务(daemon)
  14. Confluence 6 PostgreSQL 创建数据库和数据库用户
  15. [P1879][USACO06NOV]玉米田Corn Fields (状态压缩)
  16. 【工具相关】Web--nodejs的安装
  17. Linux学习笔记:使用ftp命令上传和下载文件
  18. Sitecore详细安装(包含sitecore安装过程截图)
  19. openstack安装指南和在centos7上的安装指南
  20. C++中的友元函数和友元类

热门文章

  1. 面试话痨(二)C:JAVA String,别以为你穿个马甲我就不认识你了
  2. mysql中的on
  3. (原)Non-local Neural Networks
  4. Contest 152
  5. Java基础语法(7)-数组
  6. 实例演示:如何简化生产中的Pod安全策略?
  7. [LeetCode] 936. Stamping The Sequence 戳印序列
  8. Django-rest-framework源码分析(二)
  9. OpenCV-Python 使用OCR手写数据集运行KNN | 五十四
  10. 使用webhooks进行代码的自动化部署