Go的交叉編譯

2022-07-15 00:51:07 字數 3349 閱讀 8921

**鳥窩

go 1.5以前,交叉編譯程式還是有一點麻煩的,你需要massive scripts t來編譯和宿主機器不同的程式。

正如comes with support for all architectures built in文章中介紹的, go 1.5可就簡單的多了,你只需設定goosgoarch兩個環境變數就能生成所需平台的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 ...