go build 交叉编译
Go 编译 build 交叉
2023-06-13 09:18:12 时间
go build 交叉编译
作者:matrix 被围观: 10 次 发布时间:2023-02-10 分类:Golang | 无评论 »
Golang支持跨平台编译,比起python只能编译为当前平台的二进制文件要好太多。
go build help
$ go help build
usage: go build [-o output] [build flags] [packages]
...
默认编译(输出当前平台二进制文件)
$ go build -ldflags="-s -w" main.go && upx -9 ./main
说明: upx 该工具用于压缩二进制文件 -9 表示最高压缩率(选择范围为1-9)
跨平台编译
Mac/Linux系统下:
输出Linux可执行文件:
$ CGO_ENABLE=0 GOOS=linux GOARCH=amd64 go build -ldflags='-s -w -extldflags "-static -fpic"' -o main-linux-amd64 main.go && upx -9 ./main-linux-amd64
输出Windows可执行文件:
$ CGO_ENABLE=0 GOOS=windows GOARCH=amd64 go build -ldflags='-s -w -extldflags "-static -fpic"' -o main-windows-amd64.exe main.go && upx -9 ./main-windows-amd64.exe
输出Mac可执行文件:
# Intel
$ CGO_ENABLE=0 GOOS=darwin GOARCH=amd64 go build -ldflags='-s -w -extldflags "-static -fpic"' -o main-darwin-amd64 main.go && upx -9 ./main-darwin-amd64
# Apple Silicon (M1)
$ CGO_ENABLE=0 GOOS=darwin GOARCH=arm64 go build -ldflags='-s -w -extldflags "-static -fpic"' -o main-darwin-arm64 main.go && upx -9 ./main-darwin-arm64
windows系统下:
SET CGO_ENABLE=0
SET GOOS=linux
SET GOARCH=amd64
go build -ldflags='-s -w -extldflags "-static -fpic"' main.go
参数说明
CGO_ENABLE 是否开启CGO。默认为1开启CGO(不支持交叉编译),0表示关闭CGO
GOARCH 表示CPU架构amd64(x86-64 普通家用电脑)、ARM
GOOS 表示操作系统Linux、Windows、Darwin(Mac)
-o 表示输出指定文件名(默认为main)
-a 表示强制重新构建
-ldflags参数
`-s -w` 表示减小体积,去除编译携带的符号表和调试信息
-s 忽略符号表和调试信息
-w 忽略DWARFv3调试信息,将无法使用gdb进行调试
-extldflags "-static -fpic" 表示完全静态编译(默认是静态链接 个别库可能会导致动态链接),这样编译生成的文件就可以任意放到指定平台下运行,不需要运行环境的基础依赖库()
二进制压缩工具upx(可选)
Mac下使用brew安装
$ brew install upx
$ upx --version
upx 3.96
其他平台: https://github.com/upx/upx/releases
upx压缩工具能省掉40%-70%的大小
-rwxr-xr-x 1 hhtjim staff 7.9M Feb 9 00:13 main-default
-rwxr-xr-x 1 hhtjim staff 5.5M Feb 9 00:15 main-ldflags
-rwxr-xr-x 1 hhtjim staff 2.3M Feb 9 00:34 main-upx
参考:
https://mp.weixin.qq.com/s/hx9Vbdes6cmRNMiUNqOTCQ
https://mp.weixin.qq.com/s/s6QzFkT1YU3lwkuZSHNb-A
https://dev.to/tidalcloud/how-to-cross-compile-go-app-for-apple-silicon-m1-27l6
https://docs.studygolang.com/pkg/runtime/internal/sys/#pkg-constants
https://zhuanlan.zhihu.com/p/338891206
完全静态编译一个Go程序 https://colobu.com/2018/07/20/totally-static-Go-builds/
Go编译常用参数 https://juejin.cn/post/7096772208999006244
相关文章
- 24.Go语言-Gin参数获取总结
- Go HTTP 编程 | 03 - 表单的输入与验证
- Go减小编译后的文件大小
- Go 进阶训练营 – Go 工程化实践二:API 设计
- 【Go】sync.Mutex 源码分析
- 2022-07-24:以下go语言代码输出什么?A:[]int{};B:[]int(nil);C:panic;D:编译错误。pa
- 2022-08-17:以下go语言代码输出什么?A:运行时 panic;B:32;C:编译错误;D:0。package main
- 2022-09-04:以下go语言代码输出什么?A:不能编译;B:45;C:45.2;D:45.0。package mainim
- 2022-09-12:以下go语言代码输出什么?A:true;B:false;C:无法编译;D:运行时 panic。packag
- 2022-10-20:以下go语言代码输出什么?A:7;B:7.0;C:0;D:编译错误。package mainimport
- go语言 ssh_websshpro
- LeetCode 78.子集 - Go 实现
- Go 1.18 新增三大功能之一“工作区模式”介绍
- 在线客服系统源码编译Golang语言下go build命令构建二进制程序
- 2022-11-08:以下go语言代码输出什么?A:2;B:编译错误;C:运行 panic。package mainimport
- 2022-12-31:以下go语言代码输出什么?A:1 1;B:-1 1;C:-1 -1;D:编译错误。 package mai
- GO 中 string 的实现原理
- 600+服务模块,1万+POD数量,作业帮从PHP迁移至Go实战总结
- 【错误记录】Android Studio 中编写 Gradle 编译脚本时没有 Groovy 代码提示 ( Cannot find declaration to go to )
- Go-包管理-go build(一)
- 在Mac OS上安装Go语言开发包
- Go语言程序的编译和运行
- Go语言go mod包依赖管理工具使用详解
- go build命令(go语言编译命令)完全攻略
- go get命令——一键获取代码、编译并安装
- go generate命令——在编译前自动化生成某类代码
- 环境Go 编译 在 Linux 环境中的体验(go编译linux)
- 如何用 GVM 管理 Go 项目
- SQL Server和Go组合,助力数据库计算更高效(sqlserver加go)
- 提升Go读取Oracle的速度(go读取oracle速度)
- Go语言搭建Oracle数据库快速连接方法(go语言连接oracle)
- 新技术Go语言解析Oracle数据库日志(go解析oracle日志)
- 快跟上趋势,GO DB ORACLE(go db oracle)