不管是Python 还是传统的 C、C++这些所谓的跨平台语言,在处理编译、打包上都相对比较麻烦,而 Go 语言就比较方便,不管是在Linux上还是在Windows上都可以做到跨平台编译,并且可以把可执行文件打包成一个文件,不依赖于运行环境的动态链接库。
能做到一次编译,处处运行的 JAVA,虽然编译的中间产物可以做到免维护,但在目标系统需要安装相应版本的JRE运行环境。Go 语言可以真正做到打包成静态编译的可执行文件,一个文件就可跑起来。
比如如下测试数据库连接的代码
package mainimport "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 stringfor 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=helloall: linux winlinux:CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -o ${BUILD_NAME}CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ${BUILD_NAME}_amd64win:CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -o ${BUILD_NAME}.exeCGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o ${BUILD_NAME}_amd64.execlean:rm -rfv hellorm -rfv hello_amd64rm -rfv hello.exerm -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