golang交叉編譯
問題
golang如何在一個平臺編譯另外一個平臺可以執(zhí)行的文件。比如在mac上編譯Windows和linux可以執(zhí)行的文件置侍。那么我們的問題就設(shè)定成:如何在mac上編譯64位linux的可執(zhí)行文件。
解決方案
golang的交叉編譯要保證golang版本在1.5以上鼎文,本解決方案實例代碼1.9版本執(zhí)行的劝堪。
我們想要編譯的文件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的可執(zhí)行程序。
參數(shù)解析
這里用到了兩個變量:
- GOOS:目標操作系統(tǒng)
- GOARCH:目標操作系統(tǒng)的架構(gòu)
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 |
編譯其他平臺的時候根據(jù)上面表格參數(shù)執(zhí)行編譯就可以了汽纠。
擴展閱讀
在網(wǎng)絡(luò)上的諸多教程中可能會看到下面的編譯命令
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build hello.go
其中CGO_ENABLED=0的意思是使用C語言版本的GO編譯器,參數(shù)配置為0的時候就關(guān)閉C語言版本的編譯器了傀履。自從golang1.5以后go就使用go語言編譯器進行編譯了虱朵。在golang1.9當中沒有使用CGO_ENABLED參數(shù)發(fā)現(xiàn)依然可以正常編譯。當然使用了也可以正常編譯钓账。比如把CGO_ENABLED參數(shù)設(shè)置成1碴犬,即在編譯的過程當中使用CGO編譯器,我發(fā)現(xiàn)依然是可以正常編譯的梆暮。
實際上如果在go當中使用了C的庫服协,比如import "C"
默認使用go build的時候就會啟動CGO編譯器,當然我們可以使用CGO_ENABLED=0來控制go build是否使用CGO編譯器啦粹。
以上若有錯誤歡迎指正偿荷。