問題
golang如何在一個平台編譯另外一個平台可以執行的文件。比如在mac上編譯Windows和linux可以執行的文件。那么我們的問題就設定成:如何在mac上編譯64位linux的可執行文件。
解決方案
golang的交叉編譯要保證golang版本在1.5以上,本解決方案實例代碼1.9版本執行的。 我們想要編譯的文件hello.go hello.go
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
在mac上編譯64位linux的命令編譯命令 bash:
GOOS=linux GOARCH=amd64 go build hello.go
上面這段代碼直接在命令控制台里面運行就可以生成64位linux的可執行程序。 參數解析 這里用到了兩個變量:
GOOS:目標操作系統 GOARCH:目標操作系統的架構
OS|ARCH|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
編譯其他平台的時候根據上面表格參數執行編譯就可以了。 擴展閱讀 在網絡上的諸多教程中可能會看到下面的編譯命令
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build hello.go
其中CGO_ENABLED=0的意思是使用C語言版本的GO編譯器,參數配置為0的時候就關閉C語言版本的編譯器了。自從golang1.5以后go就使用go語言編譯器進行編譯了。在golang1.9當中沒有使用CGO_ENABLED參數發現依然可以正常編譯。當然使用了也可以正常編譯。比如把CGO_ENABLED參數設置成1,即在編譯的過程當中使用CGO編譯器,我發現依然是可以正常編譯的。 實際上如果在go當中使用了C的庫,比如import “C”默認使用go build的時候就會啟動CGO編譯器,當然我們可以使用CGO_ENABLED=0來控制go build是否使用CGO編譯器。