about 2 results (0.02 seconds)

Golang在Mac、Linux、Windows下如何交叉编译

by LauCyun Jan 10,2018 11:35:44 26,397 views

Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下。

Mac 下编译 Linux 和 Windows 64位可执行程序

# Linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -i -o hello hello.go
# Windows
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -i -o hello hello.go

Linux 下编译 Mac 和 Windows 64位可执行程序

# Darwin (Mac OS)
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -i -o hello hello.go
# Windows
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -i -o hello hello.go

Windows 下编译 Mac 和 Linux 64位可执行程序

:: Darwin (Mac OS)
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build -i -o hello hello.go

:: Liunx
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -i -o hello hello.go

说明:

  • GOOS:目标平台的操作系统(darwin、freebsd、linux、netbsd、openbsd、windows) 
  • GOARCH:目标平台的体系架构(386、amd64、arm、mips、mips64、mips64le、mipsle) 
  • 交叉编译不支持 CGO 所以要禁用它

上面的命令编译 64 位可执行程序,你当然应该也会使用 386 编译 32 位可执行程序 。

多博客都提到要先增加对其它平台的支持,但是我跳过那一步,上面所列的命令也都能成功,且得到我想要的结果,可见那一步应该是非必须的,或是我所使用的 Go 版本已默认支持所有平台。

最后,给出两份脚本:

Linux:

#!/usr/bin/env bash

# Darwin (Mac OS)
CGO_ENABLED=0 GOOS=darwin GOARCH=386 $(which go) build -i -o hello-darwin-i386 hello.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(which go) build -i -o hello-darwin-amd64 hello.go

# FreeBSD
CGO_ENABLED=0 GOOS=freebsd GOARCH=386 $(which go) build -i -o hello-freebsd-i386 hello.go
CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 $(which go) build -i -o hello-freebsd-amd64 hello.go
CGO_ENABLED=0 GOOS=freebsd GOARCH=arm $(which go) build -i -o hello-freebsd-arm hello.go

# Linux
CGO_ENABLED=0 GOOS=linux GOARCH=386 $(which go) build -i -o hello-linux-i386 hello.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(which go) build -i -o hello-linux-amd64 hello.go
CGO_ENABLED=0 GOOS=linux GOARCH=arm $(which go) build -i -o hello-linux-arm hello.go
CGO_ENABLED=0 GOOS=linux GOARCH=mips $(which go) build -i -o hello-linux-mips hello.go
CGO_ENABLED=0 GOOS=linux GOARCH=mips64 $(which go) build -i -o hello-linux-mips64 hello.go
CGO_ENABLED=0 GOOS=linux GOARCH=mips64le $(which go) build -i -o hello-linux-mips64le hello.go
CGO_ENABLED=0 GOOS=linux GOARCH=mipsle $(which go) build -i -o hello-linux-mipsle hello.go

# NetBSD
CGO_ENABLED=0 GOOS=netbsd GOARCH=386 $(which go) build -i -o hello-netbsd-i386 hello.go
CGO_ENABLED=0 GOOS=netbsd GOARCH=amd64 $(which go) build -i -o hello-netbsd-amd64 hello.go
CGO_ENABLED=0 GOOS=netbsd GOARCH=arm $(which go) build -i -o hello-netbsd-arm hello.go

# OpenBSD
CGO_ENABLED=0 GOOS=openbsd GOARCH=386 $(which go) build -i -o hello-openbsd-i386 hello.go
CGO_ENABLED=0 GOOS=openbsd GOARCH=amd64 $(which go) build -i -o hello-openbsd-amd64 hello.go

# Windows
CGO_ENABLED=0 GOOS=windows GOARCH=386 $(which go) build -i -o hello-windows-i386.exe hello.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(which go) build -i -o hello-windows-amd64.exe hello.go

Windows:

:: Darwin (Mac OS)
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=386
go build -i -o hello-darwin-i386 hello.go

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build -i -o hello-darwin-amd64 hello.go


:: FreeBSD
SET CGO_ENABLED=0
SET GOOS=freebsd
SET GOARCH=386
go build -i -o hello-freebsd-i386 hello.go

SET CGO_ENABLED=0
SET GOOS=freebsd
SET GOARCH=amd64
go build -i -o hello-freebsd-amd64 hello.go

SET CGO_ENABLED=0
SET GOOS=freebsd
SET GOARCH=arm
go build -i -o hello-freebsd-arm hello.go


:: Linux
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=386
go build -i -o hello-linux-i386 hello.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -i -o hello-linux-amd64 hello.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=arm
go build -i -o hello-linux-arm hello.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=mips
go build -i -o hello-linux-mips hello.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=mips64
go build -i -o hello-linux-mips64 hello.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=mips64le
go build -i -o hello-linux-mips64le hello.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=mipsle
go build -i -o hello-linux-mipsle hello.go



:: NetBSD
SET CGO_ENABLED=0
SET GOOS=netbsd
SET GOARCH=386
go build -i -o hello-netbsd-i386 hello.go

SET CGO_ENABLED=0
SET GOOS=netbsd
SET GOARCH=amd64
go build -i -o hello-netbsd-amd64 hello.go

SET CGO_ENABLED=0
SET GOOS=netbsd
SET GOARCH=arm
go build -i -o hello-netbsd-arm hello.go


:: OpenBSD
SET CGO_ENABLED=0
SET GOOS=openbsd
SET GOARCH=386
go build -i -o hello-openbsd-i386 hello.go

SET CGO_ENABLED=0
SET GOOS=openbsd
SET GOARCH=amd64
go build -i -o hello-openbsd-amd64 hello.go


:: Windows
SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=386
go build -i -o hello-windows-i386.exe hello.go

SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=amd64
go build -i -o hello-windows-amd64.exe hello.go

(全文完)

本文转载于:https://blog.csdn.net/panshiqu/article/details/53788067

...

Tags Read More..


Golang版本管理工具 - GVM

by LauCyun Dec 7,2017 10:43:16 65,443 views

Go的环境安装和配置并不复杂,首先推荐官网的安装教程,介绍的非常全面详细。如果英文不太好的童鞋,推荐看Go环境配置,讲解的非常全面直观。

如果你有Go多版本的需求(比如新老版本共存),如果你想更简化Go环境配置(省去GOPATHGOROOT等的配置),你还希望它支持跨平台(支持Mac和Linux,不支持Windows),那么我特别推荐这款Go第三方工具:gvm——Go语言多版本安装及管理利器。

gvm,类似于Python中的pyenv,可用于管理Go的版本,它有如下几个主要特性:

  • 管理Go的多个版本,包括安装、卸载和指定使用Go的某个版本;
  • 查看官方所有可用的Go版本,同时可以查看本地已安装和默认使用的Go版本;
  • 管理多个GOPATH,并可编辑Go的环境变量;
  • 可将当前目录关联到GOPATH
  • 可以查看GOROOT下的文件差异。

尤其是前三个特性,非常实用,接下来就详细的介绍一下gvm的安装和使用。

0x1 安装

1 安装依赖组件

首先,需要安装依赖组件:

  • macOS
    $ xcode-select --install
    $ brew update
    $ brew install mercurial
  • Debian/Ubuntu
    $ sudo apt-get install curl git mercurial make binutils bison gcc build-essential
    
  • Redhat/Centos
    $ sudo yum install -y curl git make bison gcc glibc-devel
    
  • FreeBSD Requirements
    $ sudo pkg_add -r bash git mercurial

2 安装gvm

依赖安装完成后,即可安装gvm,安装命令如下:

$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

注意:如果本地用的是zsh,直接把bash替换zsh即可。


图1 安装gvm

如图1所示,即为安装成功!

0x2 使用

安装完成后,直接输入gvm help,查看使用帮助信息:


图2 gvm help

帮助简单易懂,这里介绍其中其中几个常用的命令。

1 安装go

如果碰到问题是国内无法访问gvm配置的源地址,报如下错误:

$ gvm install go1.8.3
Downloading Go source...
Installing go1.8.3...
 * Compiling...
ERROR: Couldn't download Go source. Check the logs /root/.gvm/logs/go-download.log
$ cat /root/.gvm/logs/go-download.log
Initialized empty Git repository in /root/.gvm/archive/go/.git/
error: Failed connect to go.googlesource.com:443; Operation now in progress while accessing https://go.googlesource.com/go/info/refs

fatal: HTTP request failed
Initialized empty Git repository in /root/.gvm/archive/go/.git/
Initialized empty Git repository in /root/.gvm/archive/go/.git/

国内访问不了https://go.googlesource.com/go可将GO_SOURCE_URL修改为github上的源码镜像。

修改方法:

$ vim ~/.gvm/scripts/install

修改内容为:

GO_SOURCE_URL=https://github.com/golang/go

如果你要安装的版本低于go 1.5的话,即可直接安装:

$ gvm install go1.4 -B
$ gvm use go1.4 --default

它背后做的事情是先把源码下载下来,再用c做编译。

所以如果是go 1.5+版本,其实它是用go来编译go1.5+,所以就需要用到go1.4来做编译。

# -B 表示只安装二进制包
$ gvm install go1.4 -B
$ gvm use go1.4
$ export GOROOT_BOOTSTRAP=$GOROOT
$ gvm install go1.11.6 -B

如果遇到下载二进制文件失败的话,可以先下载go1.4.*.tar.gz到本地,再拷贝到~/.gvm/archive/目录中,重新安装即可成功。

go1.4.*.tar.gz下载地址:

安装好之后,指定默认使用这个版本,加上--default即可,省去每次敲gvm use

$ gvm use go1.11.6 --default

这个时候查看go环境变量:


图3 go环境变量

可以看到其中GOPATHGOROOT等环境已经设置好了,是不是非常的nice!

2 列出已安装版本

列出本地已安装go版本,箭头表示默认使用的版本,我这里是go1.10.3


图4 gvm list

0x3 GOPATH

gvm还一个很实用的功能,可以管理多个GOPATH(Go package),是通过gvm pkgset命令。


图5 gvm pkgset

上图已经介绍的很详细,使用方法和gvm也类似,就不赘述。

在同一版本下,用gvm pkgset创建多个GOPATH,可能会占用你比较大的磁盘空间。

0x4 卸载

如果只是想卸载某个安装好的Go版本:

$ gvm uninstall go1.11.6

如果你想完全卸载掉gvm和所有安装的Go版本(需谨慎):

gvm implode

0x5 参考

0x6 更新日志

  • Dec 07, 2017:撰写;
  • Jul 20, 2018:修改gvm install go1.4 -B失败的问题;
  • Aug 14, 2018:安装版本go1.10.3,并修改图片;
  • Apr 3, 2019:安装版本go1.11.6,并修改图片。

...

Tags Read More..