go程序執(zhí)行交叉編譯的流程步驟
1 簡介
go程序可用通過交叉編譯的方式在一個平臺輸出多個平臺可運行的二進制包。
交叉編譯示意圖:

兩個方式分別為使用cgo的交叉編譯和不使用cgo的交叉編譯。無需CGO時,直接使用Go的跨平臺支持編譯。
設(shè)置環(huán)境變量如GOOS, GOARCH, CGO_ENABLED來執(zhí)行編譯,例如CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build。
Mac上交叉編譯至Linux和Windows,Linux反之,Windows亦然,需相應(yīng)調(diào)整環(huán)境變量。
支持的環(huán)境列表
go tool dist list aix/ppc64 android/386 android/amd64 android/arm android/arm64 darwin/amd64 darwin/arm64 dragonfly/amd64 freebsd/386 freebsd/amd64 freebsd/arm freebsd/arm64 freebsd/riscv64 illumos/amd64 ios/amd64 ios/arm64 js/wasm linux/386 linux/amd64 linux/arm linux/arm64 linux/loong64 linux/mips linux/mips64 linux/mips64le linux/mipsle linux/ppc64 linux/ppc64le linux/riscv64 linux/s390x netbsd/386 netbsd/amd64 netbsd/arm netbsd/arm64 openbsd/386 openbsd/amd64 openbsd/arm openbsd/arm64 openbsd/mips64 plan9/386 plan9/amd64 plan9/arm solaris/amd64 windows/386 windows/amd64 windows/arm windows/arm64
2 編譯步驟
設(shè)置MAC,LINUX,WINDOWS 編譯環(huán)境和執(zhí)行編譯。
1.Mac Mac下編譯Linux, Windows平臺的64位可執(zhí)行程序:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go
參數(shù)介紹:
$CGO_ENABLED:0表示關(guān)閉CGO
$GOOS:目標(biāo)平臺(編譯后要運行的目標(biāo)平臺)的操作系統(tǒng)
(darwin、freebsd、linux、windows)
$GOARCH:目標(biāo)平臺(編譯后要運行的目標(biāo)平臺)的體系架構(gòu)
(386、amd64、arm)分別對應(yīng)(32位、64位、ARM平臺)的架構(gòu)
2.Linux Linux下編譯Mac, Windows平臺的64位可執(zhí)行程序:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go
3.Windows Windows下編譯Mac, Linux平臺的64位可執(zhí)行程序:
cmd:
set GOARCH=amd64 go env -w GOPATH=amd64 set GOOS = linux go env -w GOOS=linux
還原:
set GOARCH=amd64
go env -w GOARCH=cmd64
set GOOS=windows
go env -w GOOS=windows
3 帶cgo交叉編譯步驟
設(shè)置環(huán)境信息
export CFLAGS="-arch arm64 -miphoneos-version-min=9.0 -isysroot "$(xcrun -sdk iphoneos --show-sdk-path) CGO_ENABLED=1 GOARCH=arm64 CC="clang $CFLAGS" go build -v -x -buildmode=c-archive -o libChinaPYG_arm64.a
這會同時生成libChinaPYG_arm64.a、libChinaPYG_arm64.h兩個文件,直接嵌入到C代碼中正常使用。
編譯 darwin/arm64 的 example 命令就是:
CC=/usr/local/go/misc/ios/clangwrap.sh GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build
編譯 darwin/arm 的 example 命令是:
CC=/usr/local/go/misc/ios/clangwrap.sh GOOS=darwin GOARCH=arm CGO_ENABLED=1 go build
linux交叉編譯windows:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -trimpath -o bin/main.exe ./cmd/dend-server/main.go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o bin/main.exe ./cmd/dend-server/main.go
4 構(gòu)建測試支持
Go 提供易于使用的支持,用于通過“ go test -coverprofile=... <pkg_target>”命令在包單元測試級別收集覆蓋率配置文件。
從 Go 1.20 開始,用戶現(xiàn)在可以為更大的集成測試收集覆蓋率配置文件:更重量級、更復(fù)雜的測試,執(zhí)行給定應(yīng)用程序二進制文件的多次運行。
對于單元測試,收集覆蓋率概況和生成報告需要兩個步驟:go test -coverprofile=...運行,然后調(diào)用go tool cover {-func,-html}生成報告。
對于集成測試,需要三個步驟:構(gòu)建步驟、運行步驟(可能涉及從構(gòu)建步驟多次調(diào)用二進制文件),最后是報告步驟,如下所述。
構(gòu)建用于覆蓋率分析的二進制文件,要構(gòu)建用于收集覆蓋率配置文件的應(yīng)用程序,請-cover在調(diào)用go build應(yīng)用程序二進制目標(biāo)時傳遞標(biāo)志。
請參閱下面的示例go build -cover調(diào)用部分。然后可以使用環(huán)境變量設(shè)置運行生成的二進制文件以捕獲覆蓋率配置文件(請參閱下一節(jié)運行)。
- 如何為檢測選擇包
在給定的“ go build -cover”調(diào)用期間,Go 命令將選擇主模塊中的包進行覆蓋率分析;默認情況下,不會包含提供給構(gòu)建的其他包(go.mod 中列出的依賴項,或作為 Go 標(biāo)準庫一部分的包)。
例如,這是一個玩具程序,包含一個主包、一個本地主模塊包greetings和一組從模塊外部導(dǎo)入的包,包括(除其他外)rsc.io/quote和fmt(完整程序的鏈接)。
$ cat go.mod
module mydomain.com
go 1.20
require rsc.io/quote v1.5.2
require (
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
rsc.io/sampler v1.3.0 // indirect
)
$ cat myprogram.go
package main
import (
"fmt"
"mydomain.com/greetings"
"rsc.io/quote"
)
func main() {
fmt.Printf("I say %q and %q\n", quote.Hello(), greetings.Goodbye())
}
$ cat greetings/greetings.go
package greetings
func Goodbye() string {
return "see ya"
}
$ go build -cover -o myprogram.exe .
$
如果您使用“ -cover”命令行標(biāo)志構(gòu)建此程序并運行它,配置文件中將恰好包含兩個包:main和mydomain.com/greetings;其他依賴包將被排除在外。
想要更好地控制包含哪些包以進行覆蓋的用戶可以使用“ -coverpkg”標(biāo)志進行構(gòu)建。例子:
$ go build -cover -o myprogramMorePkgs.exe -coverpkg=io,mydomain.com,rsc.io/quote . $
在上面的構(gòu)建中,選擇了 main 包mydomain.com以及rsc.io/quote和io包進行分析;因為 mydomain.com/greetings沒有具體列出,所以它將被排除在配置文件之外,即使它位于主模塊中。
5 運行覆蓋檢測的二進制文件
用“”構(gòu)建的二進制-cover文件在執(zhí)行結(jié)束時將配置文件數(shù)據(jù)文件寫到通過環(huán)境變量指定的目錄中GOCOVERDIR。例子:
$ go build -cover -o myprogram.exe myprogram.go $ mkdir somedata $ GOCOVERDIR=somedata ./myprogram.exe I say "Hello, world." and "see ya" $ ls somedata covcounters.c6de772f99010ef5925877a7b05db4cc.2424989.1670252383678349347 covmeta.c6de772f99010ef5925877a7b05db4cc $
請注意寫入目錄的兩個文件somedata:這些(二進制)文件包含覆蓋率結(jié)果。有關(guān)如何從這些數(shù)據(jù)文件生成人類可讀結(jié)果的更多信息,請參閱以下有關(guān)報告的部分。
如果GOCOVERDIR未設(shè)置環(huán)境變量,覆蓋檢測的二進制文件仍將正確執(zhí)行,但會發(fā)出警告。
6 小結(jié)
大多數(shù)程序使用內(nèi)置的構(gòu)建方法即可,可參考以下幾點:
1 你的程序沒有用到 CGO 的 Golang 程序,直接用編譯器自帶的跨平臺特性即可全平臺編譯;
2 用到了 CGO 需要發(fā)布到ARM平臺的Golang程序,推薦自己配置ARM交叉編譯環(huán)境;
3 用到了 CGO 需要發(fā)布到Win/Linux/Mac平臺的Golang程序,推薦用使用go-ui-crossbuild 。
以上就是go程序執(zhí)行交叉編譯的流程步驟的詳細內(nèi)容,更多關(guān)于go執(zhí)行交叉編譯的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于go手動寫個轉(zhuǎn)發(fā)代理服務(wù)的代碼實現(xiàn)
這篇文章主要介紹了基于go手動寫個轉(zhuǎn)發(fā)代理服務(wù)的代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
go?time.Sleep睡眠指定時間實例詳解(小時級到納秒級)
golang的休眠可以使用time包中的sleep,下面這篇文章主要給大家介紹了關(guān)于go?time.Sleep睡眠指定時間(小時級到納秒級)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-11-11

