zoukankan      html  css  js  c++  java
  • 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"
    >#
    
  • 相关阅读:
    团队冲刺2---个人工作总结八(6.1)
    团队冲刺2---个人工作总结七(5.31)
    opencv2 用imwrite 抽取并保存视频图像帧
    VMware 虚拟机CentOS 7 网路连接配置 无eth0简单解决办法
    个人总结
    人月神话阅读笔记03
    个人冲刺10
    人月神话阅读笔记02
    第十六周学习进度情况
    个人冲刺09
  • 原文地址:https://www.cnblogs.com/yinguohai/p/11543524.html
Copyright © 2011-2022 走看看