Golang交叉编译

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

原文地址:https://segmentfault.com/a/11...

前言

在 连载九 讲解构建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]
...-aforce rebuilding of packages that are already up-to-date.-nprint the commands but do not run them.-p nthe number of programs, such as build commands ortest binaries, that can be run in parallel.The default is the number of CPUs available.-raceenable data race detection.Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.-msanenable interoperation with memory sanitizer.Supported only on linux/amd64,and only with Clang/LLVM as the host C compiler.-vprint the names of packages as they are compiled.-workprint the name of the temporary work directory anddo not delete it when exiting.-xprint the commands.-asmflags '[pattern=]arg list'arguments to pass on each go tool asm invocation.-buildmode modebuild mode to use. See 'go help buildmode' for more.-compiler namename 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 suffixa 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 raceor, if set explicitly, has _race appended to it. Likewise for the -msanflag. Using a -buildmode option that requires non-default compile flagshas a similar effect.-ldflags '[pattern=]arg list'arguments to pass on each go tool link invocation.-linksharedlink against shared libraries previously created with-buildmode=shared.-pkgdir dirinstall 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 thebuild. For more information about build tags, see the description ofbuild 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-gin-example

本系列目录

  • 连载一 Golang介绍与环境安装
  • 连载二 搭建Blog API's(一)
  • 连载三 搭建Blog API's(二)
  • 连载四 搭建Blog API's(三)
  • 连载五 使用JWT进行身份校验
  • 连载六 编写一个简单的文件日志
  • 连载七 Golang优雅重启HTTP服务
  • 连载八 为它加上Swagger
  • 连载九 将Golang应用部署到Docker
  • 连载十 定制 GORM Callbacks
  • 连载十一 Cron定时任务
  • 连载十二 优化配置结构及实现图片上传
  • 连载十三 优化你的应用结构和实现Redis缓存
  • 连载十四 实现导出、导入 Excel
  • 连载十五 生成二维码、合并海报
  • 连载十六 在图片上绘制文字
  • 连载十七 用 Nginx 部署 Go 应用
  • 番外 Golang交叉编译
  • 番外 请入门 Makefile

书籍

  • Go并发编程实战 第二版

Gin实践 番外 Golang交叉编译相关推荐

  1. 一起实践量化番外篇——TensorRT-8的量化细节

    好久不见各位~ 这篇文章很久之前写完一直没有整理,最近终于是整理差不多了,赶紧发出来. 本文接着<必看部署系列-神经网络量化教程:第一讲!>这一篇接着来说.上一篇主要说了量化的一些基本知识 ...

  2. 动态正则化权重系数_蘑菇街增量学习番外篇三:deepFM的动态正则实践

    欢迎关注公众号: 『诗品算法』,禁止一切未经本人@琦琦许可的转载.转载必须注明出处. 0.引言 这篇文章仍是在蘑菇街 增量学习背景下的实践,增量学习的理论很简单,但实践起来,还是有很多细节和trick ...

  3. 番外篇:STM32之GPIO口速率配置究竟代表什么

    番外篇:STM32之GPIO口速率配置究竟代表什么 用过STM32的童鞋们都知道,STM32在GPIO配置时都需要选择一个GPIO速率,对于STM32F103系列芯片来说最快的配置应该是50Mhz左右 ...

  4. 白话机器学习算法理论+实战番外篇之LightGBM

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...

  5. #3使用html+css+js制作网页 番外篇 使用python flask 框架 (I)

    #3使用html+css+js制作网页 番外篇 使用python flask 框架(I 第一部) 0. 本系列教程 1. 准备 a.python b. flask c. flask 环境安装 d. f ...

  6. 量化番外篇——TensorRT-8的量化细节

    好久不见各位~ 这篇文章很久之前写完一直没有整理,最近终于是整理差不多了,赶紧发出来. 本文接着<必看部署系列-神经网络量化教程:第一讲!>这一篇接着来说.上一篇主要说了量化的一些基本知识 ...

  7. Android开发:第五日番外——过时的函数和被横杠的函数

    零.... 好吧,估计以后每篇都会来个零开头进行吐槽了.话说第五日正番依旧难产中,先把番外给写了.番外嘛都是一些小的知识点,未免遗忘,特此记录.今天发现关于设计模式,本人零概念啊,这是什么概念啊,虽然 ...

  8. 多线程番外之真假*程

    多线程番外之真假*程 //写在之前 "有没有同学心里有疑问的,多线程才涉及那么很浅显的一点,为什么会惊现番外这一说呢,所谓番外,就是对正文做的补充,通常不录入正文,是作者主动在题材中加入的部 ...

  9. java优先队列的入队函数,算法与数据结构番外(1):优先队列

    这是算法与数据结构番外系列的第一篇,这个系列未来的主要内容是补充一些与算法与数据结构相关的知识,这些知识比较零碎,同时也与正传关系密切,往往需要阅读了正传的相关内容以后,才能较好的理解这部分内容.如果 ...

最新文章

  1. PON:EPON/GPON/10G PON/XG-PON/NG-PON2—Vecloud微云
  2. 开户oracle监听,R12:银行账户开户人?
  3. linux+ip+路由设置,Linux下IP巧设置-网管专栏,防火墙和路由
  4. 你的元器件为什么会无缘无故地失效了?
  5. 数据基本类型以及相关举例
  6. 无人驾驶(如何自己构建hdmap)
  7. 接口说明_接口说明_实时语音识别_智能语音交互-阿里云
  8. 微型计算机是一种将CPU,Bwnhlq计算机一级考试选择题题库之微型计算机基础题及答案(XX年最新版)1.doc...
  9. IP属地信息哪里来的?手把手教你实现通过IP查询属地信息
  10. java菜鸟驿站_阿里巴巴内推(菜鸟驿站)一面总结
  11. 什么是 CDN 边缘服务器 - Edge Server
  12. win7摄像头软件_【pc软件】功能强大的GIF动图制作录制工具,秒杀
  13. 微信公众号开发详细过程(亲手总结)
  14. 移动硬盘数据错误循环冗余检查,要怎么恢复资料
  15. AES200 软件用户手册
  16. Python中对于Json空对象的处理
  17. 仿豌豆荚实现android连接pc方法
  18. winXp 共享打印问题处理方法(终极版)
  19. Cisco Cpos STM 配置示例
  20. JavaWeb——Servlet生命周期

热门文章

  1. java mathrandom函数_java Math数学工具及Random随机函数
  2. find找多个单元格的文本_灵活套用LEFT、RIGHT、MID、FIND函数,解决90%的信息提取问题...
  3. 【CF321E】+【bzoj5311】贞鱼
  4. 使用pdo,使用pdo无法插入数据怎么办
  5. tensorflow学习笔记一:安装调试
  6. 设计: ListView 接口,and the missing read-only interfaces in java collection framework
  7. java异步线程池同时请求多个接口数据
  8. python安装扩展常用的工具是_Python 安装扩展库常用的是 _______ 工具_学小易找答案...
  9. Activiti 流程查询出的结果封装为 JSON 时出现的异常
  10. csgo 机器人模式_分享一个休闲模式机器人Bug