Gin实践 番外 Golang交叉编译

14

项目地址:https://github.com/EDDYCJY/go... (快上车,支持一波)

原文地址:Golang交叉编译

前言

连载九 讲解构建Scratch镜像时,我们编译可执行文件用了另外一个形式的命令,不知道你有没有疑问?

$ CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o go-gin-example .

说明

我们将讲解命令各个参数的作用,希望你在阅读时,将每一项串联起来,你会发现这就是交叉编译相关的小知识

也就是 Golang 令人心动的特性之一跨平台编译

一、CGO_ENABLED

作用:

用于标识(声明) cgo 工具是否可用

意义:

存在交叉编译的情况时,cgo 工具是不可用的。在标准go命令的上下文环境中,交叉编译意味着程序构建环境的目标计算架构的标识与程序运行环境的目标计算架构的标识不同,或者程序构建环境的目标操作系统的标识与程序运行环境的目标操作系统的标识不同

小结:

结合案例来说,我们是在宿主机编译的可执行文件,而在 Scratch 镜像运行的可执行文件;显然两者的计算机架构、运行环境标识你无法确定它是否一致(毕竟构建的 docker 镜像还可以给他人使用),那么我们就要进行交叉编译,而交叉编译不支持 cgo,因此这里要禁用掉它

关闭 cgo 后,在构建过程中会忽略 cgo 并静态链接所有的依赖库,而开启 cgo 后,方式将转为动态链接

补充:

golang 是默认开启 cgo 工具的,可执行 go env 命令查看

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
...
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
...

二、GOOS

用于标识(声明)程序构建环境的目标操作系统

如:

  • linux
  • windows

三、GOARCH

用于标识(声明)程序构建环境的目标计算架构

若不设置,默认值与程序运行环境的目标计算架构一致(案例就是采用的默认值)

如:

  • amd64
  • 386
系统 GOOS GOARCH
Windows 32位 windows 386
Windows 64位 windows amd64
OS X 32位 darwin 386
OS X 64位 darwin amd64
Linux 32位 linux 386
Linux 64位 linux amd64

四、GOHOSTOS

用于标识(声明)程序运行环境的目标操作系统

五、GOHOSTARCH

用于标识(声明)程序运行环境的目标计算架构

六、go build

-a

强制重新编译,简单来说,就是不利用缓存或已编译好的部分文件,直接所有包都是最新的代码重新编译和关联

-installsuffix

作用:

在软件包安装的目录中增加后缀标识,以保持输出与默认版本分开

补充:

如果使用 -race 标识,则后缀就会默认设置为 -race 标识,用于区别 race 和普通的版本

-o

指定编译后的可执行文件名称

小结

大部分参数指令,都有一定关联性,且与交叉编译的知识点相关,可以好好品味一下

最后可以看看 go build help 加深了解

$ go help build
usage: go build [-o output] [-i] [build flags] [packages]
...
    -a
        force rebuilding of packages that are already up-to-date.
    -n
        print the commands but do not run them.
    -p n
        the number of programs, such as build commands or
        test binaries, that can be run in parallel.
        The default is the number of CPUs available.
    -race
        enable data race detection.
        Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.
    -msan
        enable interoperation with memory sanitizer.
        Supported only on linux/amd64,
        and only with Clang/LLVM as the host C compiler.
    -v
        print the names of packages as they are compiled.
    -work
        print the name of the temporary work directory and
        do not delete it when exiting.
    -x
        print the commands.

    -asmflags '[pattern=]arg list'
        arguments to pass on each go tool asm invocation.
    -buildmode mode
        build mode to use. See 'go help buildmode' for more.
    -compiler name
        name of compiler to use, as in runtime.Compiler (gccgo or gc).
    -gccgoflags '[pattern=]arg list'
        arguments to pass on each gccgo compiler/linker invocation.
    -gcflags '[pattern=]arg list'
        arguments to pass on each go tool compile invocation.
    -installsuffix suffix
        a suffix to use in the name of the package installation directory,
        in order to keep output separate from default builds.
        If using the -race flag, the install suffix is automatically set to race
        or, if set explicitly, has _race appended to it. Likewise for the -msan
        flag. Using a -buildmode option that requires non-default compile flags
        has a similar effect.
    -ldflags '[pattern=]arg list'
        arguments to pass on each go tool link invocation.
    -linkshared
        link against shared libraries previously created with
        -buildmode=shared.
    -pkgdir dir
        install and load all packages from dir instead of the usual locations.
        For example, when building with a non-standard configuration,
        use -pkgdir to keep generated packages in a separate location.
    -tags 'tag list'
        a space-separated list of build tags to consider satisfied during the
        build. For more information about build tags, see the description of
        build constraints in the documentation for the go/build package.
    -toolexec 'cmd args'
        a program to use to invoke toolchain programs like vet and asm.
        For example, instead of running asm, the go command will run
        'cmd args /path/to/asm <arguments for asm>'.
...

参考

本系列示例代码

本系列目录

书籍

  • Go并发编程实战 第二版

如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

15 条评论
Devin小洋人 · 2018年03月26日

这个系列完结了么?
一路跟着做下来了,帮助很大

+1 回复

0

还没有完结。

像这一篇是针对连载九知识点的番外,因为存在一个问题,在个别篇章中所涉及的知识点太多了,如果一次性讲完,文章篇幅太大了。
但是我又想告诉你们这些知识点,因此今天想了下,可以做个番外章节。

煎鱼 作者 · 2018年03月26日
0

对你们有帮助就好,感谢老铁支持!
哈哈哈可以点点赞给个star什么的,让我感觉到有人。。。

煎鱼 作者 · 2018年03月26日
0

@煎鱼 那必须的

Devin小洋人 · 2018年03月27日
Mr_大帅 · 2018年05月02日

点了个star ,感谢大佬,希望继续连载,讲讲web以外的应用

+1 回复

0

感谢老铁支持!
其他方面的话,有计划,但是一步步来吧

可以先看看这波
Golang爬虫 爬取最简单的豆瓣电影 Top250
Golang爬虫 爬取汽车之家 二手车产品库
爬虫带你了解一下Golang的市场行情

煎鱼 作者 · 2018年05月02日
CatMaster · 2018年06月23日

谢谢大佬,受益匪浅

+1 回复

0

感谢老铁支持 👍

煎鱼 作者 · 2018年06月23日
wantSleep · 2018年12月17日

-installsuffix
大佬,这个能不能具体点,实际用处在哪里?

回复

swordfish · 1月1日

给大佬点赞

回复

0

加油 💪

煎鱼 作者 · 2月17日
swordfish · 1月1日

大佬有qq或者微信群之类的吗~

回复

0

感谢支持,群之类的暂时都还没有哦

如果有问题可以在 SF 私信我,或者到 https://github.com/EDDYCJY 上找到我 😀

煎鱼 作者 · 1月1日
Eric · 2月17日

感谢大佬,跟着一路做下来, 帮助很大

回复

0

不客气,加油好好学,给你领进门了 😄

煎鱼 作者 · 2月17日
载入中...