不管是Python 还是传统的 C、C++这些所谓的跨平台语言,在处理编译、打包上都相对比较麻烦,而 Go 语言就比较方便,不管是在Linux上还是在Windows上都可以做到跨平台编译,并且可以把可执行文件打包成一个文件,不依赖于运行环境的动态链接库。

能做到一次编译,处处运行的 JAVA,虽然编译的中间产物可以做到免维护,但在目标系统需要安装相应版本的JRE运行环境。Go 语言可以真正做到打包成静态编译的可执行文件,一个文件就可跑起来。

比如如下测试数据库连接的代码

package main

import "fmt"

import (
"database/sql"
_ "github.com/sijms/go-ora/v2"

)

func main() {

conn, err := sql.Open("oracle", "oracle://user:password@192.168.1.1:1521/service_name?TRACE FILE=trace.log")
if err != nil {
fmt.Println(err)
}
defer conn.Close()
stmt, err := conn.Prepare("select sysdate from dual")
if err != nil {
fmt.Println(err)
}

defer stmt.Close()
rows, err := stmt.Query()
if err != nil {
fmt.Println(err)
}
defer rows.Close()
var data string
for rows.Next() {
rows.Scan(&data)
fmt.Println(data)
}
}

我们需要编译出不同平台的可执行文件:

  • linux 32bit

  • linux 64bit

  • windows 32bit ( win xp、win7 32bit)

  • windows 64bit(win7 64bit、win10 64bit)

我们只用写好 Makefile 即可编译出所需平台的可执行文件

BUILD_NAME=hello

all: linux win

linux:
CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -o ${BUILD_NAME}
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ${BUILD_NAME}_amd64

win:
CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -o ${BUILD_NAME}.exe
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o ${BUILD_NAME}_amd64.exe

clean:
rm -rfv hello
rm -rfv hello_amd64
rm -rfv hello.exe
rm -rfv hello_amd64.exe

因为 Makefile 的缩进必须以Tab键开头,如果粘贴网页可能会出问题,我们通过 cat -A Makefile 可以看到文本内容如下:

其中Tab键识别为 ^I, $表示行尾标识。执行 make all 可以编译出四种可执行文件。

$ make all
$ file hello*| awk -F, '{print $1}'| sort -k 3

当前编译环境为 win10 64bit,默认执行 go build 会编译出当前平台的可执行文件。之所以在 Windows 下可以运行 make,是因为安装了 MSYS2,在 MinGW 环境下运行 go build。将 go 的bin目录加到 PATH 环境变量中即可在 MinGW 环境下运行 go。

MSYS2 的安装和使用文档:

在windows下执行make

hyang0,公众号:生有可恋MSYS2 安装

Go 语言环境的安装和入门,可以参考:

在windows上使用go语言

hyang0,公众号:生有可恋Tutorial: Get started with Go

go 语言的交叉编译特性可以用来快速部署跨平台的服务或脚本,并且无视主机环境。当前支持的架构非常丰富,非常适合在不同硬件架构下跑自动化任务。go 语言支持的CPU架构有:

参考:

  • https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63