首页 > 编程语言 >Golang的跨平台编译程序

Golang的跨平台编译程序

时间:2023-07-18 21:03:08浏览次数:40  
标签:amd64 Golang 编译 跨平台 64 386 go Go 编译程序

Golang支持交叉编译,也就是说你在32位平台的机器上开发,可以编译生成64位平台上的可执行程序。

交叉编译依赖下面几个环境变量:

$GOARCH    目标平台(编译后的目标平台)的处理器架构(386、amd64、arm)
$GOOS          目标平台(编译后的目标平台)的操作系统(darwin、freebsd、linux、windows)

各平台的GOOS和GOARCH参考 

OS                   ARCH                          OS version

linux                386 / amd64 / arm             >= Linux 2.6

darwin               386 / amd64                   OS X (Snow Leopard +

freebsd              386 / amd64                   >= FreeBSD 7

windows              386 / amd64                   >= Windows 2000


跨平台编译步骤:

一、了解目标平台架构:

下面几个命令有助于了解目标平台的架构:

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-279.19.1.el6.x86_64 #1 SMP Wed Dec 19 07:05:20 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# uname -m
x86_64
[root@localhost ~]# arch
x86_64
[root@localhost ~]# file /bin/cat
/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[root@localhost ~]#

这里可以看到这个服务器的架构是 x86_64 这个架构亦称 amd64.

  • 6g是amd64的go编译器,它生成的是.6文件。
  • 386一般使用8g命令,它生成的一般是.8格式的文件。
  • 当然还有一个5g的命令是用于arm的cpu,

同理amd64用6l,386用8l,arm用5l的链接器

参考资料:

Linux下如何查看系统是32位还是64位的?

 

 

二、准备目标平台需要的包和工具文件

执行下面命令:

$ cd /usr/local/go/src
$ sudo CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash

这里 额外多一个环境变量 CGO_ENABLED 是因为 交叉编译不支持 CGO,我们这里禁用它。

这里并不是重新编译Go,因为安装Go的时候,只是编译了本地系统需要的东西;而需要跨平台交叉编译,需要在Go中增加对其他平台的支持。所以,有 ./make.bash 这么一个过程。

执行结果类似如下:

sudo CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash
Password:
# Building C bootstrap tool.
cmd/dist

# Building compilers and Go bootstrap tool for host, darwin/amd64.
lib9
libbio
libmach
misc/pprof
cmd/addr2line
cmd/cov
cmd/nm
cmd/objdump
cmd/pack
cmd/prof
cmd/cc
…...
pkg/text/template/parse
pkg/text/template
pkg/go/doc
pkg/go/build
cmd/go
pkg/runtime (linux/amd64)

# Building packages and commands for host, darwin/amd64.
runtime
errors
sync/atomic
unicode
unicode/utf8
math
sync
unicode/utf16
crypto/subtle
io
syscall
……….
net/rpc/jsonrpc
testing/iotest
testing/quick

# Building packages and commands for linux/amd64.
runtime
errors
sync/atomic
unicode
unicode/utf8
math
sync
unicode/utf16
……..
testing
net/rpc/jsonrpc
testing/iotest
testing/quick

---
Installed Go for linux/amd64 in /usr/local/go
Installed commands in /usr/local/go/bin

安装完成后,我们可以看到 Go的安装目录下 多了这个平台特有的几个命令行工具。

Golang的跨平台编译程序_Go

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、编译对应平台下的执行文件

到源代码目录下执行:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

不带前面参数的 go build 只是编译出开发环境适用的执行文件。

 

 

 

 

参考资料:

Cross compile Go on OSX?
http://stackoverflow.com/questions/12168873/cross-compile-go-on-osx

跨平台编译Go程序
http://bbs.studygolang.com/thread-65-1-1.html
http://solovyov.net/en/2012/cross-compiling-go/
http://studygolang.com/topics/21

An introduction to cross compilation with Go
http://dave.cheney.net/2012/09/08/an-introduction-to-cross-compilation-with-go

标签:amd64,Golang,编译,跨平台,64,386,go,Go,编译程序
From: https://blog.51cto.com/u_15588078/6768255

相关文章

  • Golang做的验证码(2)
    前面一篇文章介绍了2个用Golang做的验证码 这里再补充几个:1、在GAE上使用的Google的验证码(ReCAPTCHA)封装https://github.com/ThePiachu/GAE-Go-ReCAPTCHA这个的核心代码只在下面这个文件:https://github.com/ThePiachu/GAE-Go-ReCAPTCHA/blob/master/ReCaptcha/ReCaptcha.go 2、一......
  • Golang连接Oracle数据库
    Golang连接Oracle的库有很多,比较常见的如下:不过,oralce只提供了oci8的接口,必须通过它来调用,所以下面方案都逃不过相关设置。1、go-db-oracle地址:https://code.google.com/p/go-db-oracle/官方介绍:OracleDriverusingcgotocallOCIlibrariesfromOracleInstantClient11.......
  • centos7 下全局配置最新版的golang语言开发环境
    按照以下步骤进行操作:前往Go官方网站下载页面(https://golang.org/dl/)查找最新版本的Go二进制文件。使用wget命令下载最新版本的Go二进制文件。例如,如果最新版本是1.17,执行以下命令:$wgethttps://golang.org/dl/go1.17.linux-amd64.tar.gz解压缩下载的压缩包:$sudota......
  • golang 重塑切片指针接口
    result*[]xxx  1.判断接口是否为空   2.构造新指针类型,并赋值空切片ifreflect.ValueOf(result).Elem().IsNil(){resultType:=reflect.TypeOf(result).Elem()t2:=reflect.New(resultType)t3:=t2.Elem()t3.Set(reflect.......
  • 用 Golang 从0到1实现一个高性能的 Worker Pool(一) - 每天5分钟玩转 GPT 编程系列(3)
    目录1.概述2.设计2.1让GPT-4给出功能点2.2自己总结需求,再给GPT派活3.实现3.1你先随意发挥3.2你得让Worker跑起来呀3.3你说说Pool满了怎么办3.4你得把UT给我加上3.5你再给我把文档补上4.总结1.概述话说,早几天一口气过了一遍Golang的并发机制:跟着GPT-4......
  • GoFrame v2.5 版本发布,企业级 Golang 开发框架
    大家好啊,GoFrame 框架今天发布了 v2.5.0 正式版本啦!......
  • 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架
    基于Avalonia11.0.0+ReactiveUI的跨平台项目开发1-通用框架Avalonia简介:Avalonia是.NET的一个跨平台UI框架,提供了一个灵活的样式系统,支持广泛的操作系统,如Windows、Linux、macOS,并对Android、iOS和WebAssembly提供了实验性支持。为什么使用Avalonia:之前已经了解了基于Avalon......
  • golang占位符
    golang占位符%v,%+v,%#v有什么区别?原创 萧瑟 golang面试经典讲解 2023-07-1220:05 发表于上海收录于合集#go14个#go语言14个#面试43个一、前言平时遇到这样的疑问,怎么样解决呢?教大家一个小技巧,windows直接ctrl+单击fmt包名查看注释即可得到官方的解释,如下......
  • 对 Golang 中 reflect 反射包的示例
    引子//由于反射是基于类型系统(typesystem)的,所以先简单了解下类型系统typeMyIntintREADMEvariintvarjMyInt//上面的i是int类型,j是MyInt类型,i和j是不同的静态类型,尽管他们都有相同的相关类型(这里是int)//它们不能互相赋值,除非通过强制的类型转换......
  • goland打开配置golang工程
    有一个golang工程,没有go.mod,用goland打开,配置编译,会提示没有go.mod,但是增加了go.mod,又提示工程目录下引用的包找不到。去掉go.mod先把go.mod关闭把工程目录加入GOPATH......