什么是跨平台交叉编译

交叉编译

通俗地讲就是在一种平台上编译出其他几个平台能够运行的程序(通常指系统和CPU架构的不同)

交叉编译通常使用在分发时,编译出多个平台可用的二进制程序,比如在Linux下编译出可以在Win下可以使用的EXE程序。

本地编译

本地编译是指当前系统所配置编译器根据当前系统配置编译出在当前系统所适用的执行程序(部分其他语言本地编译时可能会由于扩展包含的问题,无法在同平台其他机器运行)。

所以如果要生成在非本机的其他平台和系统的程序,就需要用到交叉编译(交叉编译工具链)。

交叉编译工具链

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc 3个部分组成。

有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。

Golang 的跨平台交叉编译

Go语言是编译型语言,可以将程序编译后在将其拿到其它操作系统中运行,此过程只需要在编译时增加对其它系统的支持。

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

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

各平台的GOOS和GOARCH支持情况

GOOS

GOARCH

OS version

linux

386 / amd64 / arm

>= Linux 2.6

darwin

386 / amd64

OS X (Snow Leopard + Lion)

freebsd

386 / amd64

>= FreeBSD 7

windows

386 / amd64

>= Windows 2000

Golang交叉编译步骤(可跳过)

首先进入$GOROOT/go/src 源码所在目录,执行如下命令创建目标平台所需的包和工具文件

# 如果你想在Windows 32位系统下运行
cd $GOROOT/src
CGO_ENABLED=0 GOOS=windows GOARCH=386 ./make.bash
# 如果你想在Windows 64位系统下运行
cd $GOROOT/src
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash

# 如果你想在Linux 32位系统下运行
cd $GOROOT/src
CGO_ENABLED=0 GOOS=linux GOARCH=386 ./make.bash
# 如果你想在Linux 64位系统下运行
cd $GOROOT/src
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash

交叉编译当前项目

# 如果你想在Windows 32位系统下运行
CGO_ENABLED=0 GOOS=windows GOARCH=386 go build test.go
# 如果你想在Windows 64位系统下运行
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

# 如果你想在Linux 32位系统下运行
CGO_ENABLED=0 GOOS=linux GOARCH=386 go build test.go
# 如果你想在Linux 64位系统下运行
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go

上面命令中的 CGO_ENABLED = 0 表示设置CGO工具不可用; GOOS 表示程序构建环境的目标操作系统(Linux、Windows); GOARCH 表示程序构建环境的目标计算架构(32位、64位);

现在你可以在相关目标操作系统上运行编译后的程序了。