- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
11.11 交叉编译
交叉编译 是一个为您工作平台之外的 CPU 架构生成可执行二进制文件的过程。
您从交叉编译获得的主要好处是您不需要第二台或第三台不同架构的机器来生成可执行文件。这意味着您基本上只需要一台机器来做开发。幸运的是,Go 内建了支持交叉编译!
为了这节的目的,我们使用 xCompile.go
的代码来说明交叉编译的过程。xCompile.go
的代码如下:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println("You are using ", runtime.Compiler, " ")
fmt.Println("on a", runtime.GOARCH, "machine")
fmt.Println("with Go version", runtime.Version())
}
在一台 macOS High Sierra 机器上运行 xCompile.go
产生如下输出:
$ go run xCompile.og
You are using gc on a amd64 machine
with Go version go1.10
为了交叉编译 Go 源文件,您需要设置 GOOS
和 GOARCH
环境变量来分别指定目标系统和 CPU 架构,这并不像听起来那么困难。
因此,交叉编译过程如下:
$ env GOOS=linux GOARCH=arm go build xCompile.go
$ file xCompile
xCompile: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, with debug_info, not stripped
$ ./xCompile
-bash: ./xCompile: cannot execute binary file
第一个命令产生一个二进制文件,用于运行在使用 ARM CPU 架构的Linux 机器上,而 file(1)
的输出验证了产生的二进制文件的确是一个不同的 CPU 架构。
由于,我们使用一台有 Intel 处理器的 Debian Linux 机器来演示该例子,所以需要使用正确的 GOARCH
值再执行一次 go build
命令:
$ env GOOS=linux GOARCH=386 go build xCompile.go
$ file xCompile
xCompile: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, with debug_info, not stripped
在 Linux 机器上执行产生的二进制文件将产生如下输出:
$ ./xCompile
You are using gc on a 386 machine
with Go version go1.10
$ go version
go version go1.3.3 linux/amd64
$ go run xCompile.go
You are using gc on a amd64 machine
with Go version go1.3.3
这里第一个需要注意的是,xCompile.go
交叉编译后的二进制文件,打印的Go 版本是编译机的 Go 版本。第二个注意事项是,Linux 机器的 CPU 架构实际是 386
而不是 amd64
用于交叉编译。
您可以在 http://golang.org/doc/install//source找到
GOOS
和GOARCH
环境变量可用值列表。然而,注意不是所有的GOOS
和GOARCH
对都是有效的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论