**鳥窩
go 1.5以前,交叉編譯程式還是有一點麻煩的,你需要massive scripts t來編譯和宿主機器不同的程式。
正如comes with support for all architectures built in文章中介紹的, go 1.5可就簡單的多了,你只需設定goos和goarch兩個環境變數就能生成所需平台的go程式。
比如使用下面的**測試:
package main
import "fmt"
import "runtime"
func main()
編譯它:$ goos=darwin goarch=386 go build
*** 跨系統編譯
mac下編譯linux和windows平台64位可執行程式需要設定
linux
cgo_enabled=0 goos=linux goarch=amd64 go build;
windows
cgo_enabled=0 goos=windows goarch=amd64 go build;
linux下編譯mac和windows平台64位可執行程式
maccgo_enabled=0 goos=darwin goarch=amd64 go build;
windows
cgo_enabled=0 goos=windows goarch=amd64 go build;
windows下編譯mac和linux平台64位可執行程式
macset cgo_enabled=0 // 禁用cgo
set goos=darwin // 目標平台設定
set goarch=amd64 // 64位系統
go build
linux
set cgo_enabled=0
set goos=linux
set goarch=amd64
go build
就可以生成執行在os x
上的程式。
可用的os和arch的值如下:
$goos
$goarch
darwin
386
darwin
amd64
darwin
arm
darwin
arm64
dragonfly
amd64
freebsd
386
freebsd
amd64
freebsd
arm
linux
386
linux
amd64
linux
arm
linux
arm64
linux
ppc64
linux
ppc64le
netbsd
386
netbsd
amd64
netbsd
arm
openbsd
386
openbsd
amd64
openbsd
arm
plan9
386
plan9
amd64
solaris
amd64
windows
386
windows
amd64
不同的作業系統下的庫可能有不同的實現, 比如syscall庫。go build沒有內建的#define
或者預處理器之類的處理平台相關的**取捨, 而是採用tag和檔案字尾的方式實現。
tag方式
tag遵循一下規則
a build tag is evaluated as the or of space-separated options
each option evaluates as the and of its comma-separated terms
each term is an alphanumeric word or, preceded by !, its negation
在檔案的頭部增加tag:
// +build darwin freebsd netbsd openbsd
可以有多個tag,之間是and的關係
// +build linux darwin
// +build 386
注意tag和package中間需要有空行分隔,下面的例子是不對的:
// +build !linux
package mypkg // wrong
檔案字尾方式
以_$goos.go為字尾的檔案只在此平台上編譯,其它平台上編譯時就當此檔案不存在。完整的字尾如:
_$goos_$goarch.go
如syscall_linux_amd64.go,syscall_windows_386.go,syscall_windows.go等。 go交叉編譯
指定叉編譯目標 goarch 目標平台 編譯後的目標平台 的處理器架構 386 amd64 arm goos 目標平台 編譯後的目標平台 的作業系統 darwin freebsd linux windows 一 windows 下編譯linux 64位可執行程式 set cgo enabled 0 ...
Go交叉編譯
使用go語言做了乙個微服務,微服務中的乙個功能,需要呼叫底層so。該微服務執行於arm64架構,系統為aarch64 gnu linux。因此需要交叉編譯。第一步 編寫編譯指令碼,指令碼中需要設定環境變數 go build v 第二步 調整gcc編譯環境。如下圖中5項,預設用於編譯和鏈結的工具。位於...
Go交叉編譯
golang的交叉編譯要保證golang版本在1.5以上,本解決方案例項 1.9版本執行的。goos linux goarch amd64 go build hello.go這裡用到了兩個變數 goos 目標作業系統 goarch 目標作業系統的架構 osarch os version linux ...