欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go程序執(zhí)行交叉編譯的流程步驟

 更新時(shí)間:2024年07月10日 08:29:15   作者:楽碼  
go程序可用通過交叉編譯的方式在一個(gè)平臺輸出多個(gè)平臺可運(yùn)行的二進(jìn)制包,本文給大家詳細(xì)介紹了go程序執(zhí)行交叉編譯的流程步驟,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下

1 簡介

go程序可用通過交叉編譯的方式在一個(gè)平臺輸出多個(gè)平臺可運(yùn)行的二進(jìn)制包。

交叉編譯示意圖:

兩個(gè)方式分別為使用cgo的交叉編譯和不使用cgo的交叉編譯。無需CGO時(shí),直接使用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)平臺(編譯后要運(yùn)行的目標(biāo)平臺)的操作系統(tǒng)
    (darwin、freebsd、linux、windows)
  $GOARCH:目標(biāo)平臺(編譯后要運(yùn)行的目標(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

這會同時(shí)生成libChinaPYG_arm64.a、libChinaPYG_arm64.h兩個(gè)文件,直接嵌入到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)用程序二進(jìn)制文件的多次運(yùn)行。

對于單元測試,收集覆蓋率概況和生成報(bào)告需要兩個(gè)步驟:go test -coverprofile=...運(yùn)行,然后調(diào)用go tool cover {-func,-html}生成報(bào)告。

對于集成測試,需要三個(gè)步驟:構(gòu)建步驟、運(yùn)行步驟(可能涉及從構(gòu)建步驟多次調(diào)用二進(jìn)制文件),最后是報(bào)告步驟,如下所述。

構(gòu)建用于覆蓋率分析的二進(jìn)制文件,要構(gòu)建用于收集覆蓋率配置文件的應(yīng)用程序,請-cover在調(diào)用go build應(yīng)用程序二進(jìn)制目標(biāo)時(shí)傳遞標(biāo)志。

請參閱下面的示例go build -cover調(diào)用部分。然后可以使用環(huán)境變量設(shè)置運(yùn)行生成的二進(jìn)制文件以捕獲覆蓋率配置文件(請參閱下一節(jié)運(yùn)行)。

  • 如何為檢測選擇包

在給定的“ go build -cover”調(diào)用期間,Go 命令將選擇主模塊中的包進(jìn)行覆蓋率分析;默認(rèn)情況下,不會包含提供給構(gòu)建的其他包(go.mod 中列出的依賴項(xiàng),或作為 Go 標(biāo)準(zhǔn)庫一部分的包)。

例如,這是一個(gè)玩具程序,包含一個(gè)主包、一個(gè)本地主模塊包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)建此程序并運(yùn)行它,配置文件中將恰好包含兩個(gè)包:main和mydomain.com/greetings;其他依賴包將被排除在外。

想要更好地控制包含哪些包以進(jìn)行覆蓋的用戶可以使用“ -coverpkg”標(biāo)志進(jìn)行構(gòu)建。例子:

	$ go build -cover -o myprogramMorePkgs.exe -coverpkg=io,mydomain.com,rsc.io/quote .
	$

在上面的構(gòu)建中,選擇了 main 包mydomain.com以及rsc.io/quote和io包進(jìn)行分析;因?yàn)?mydomain.com/greetings沒有具體列出,所以它將被排除在配置文件之外,即使它位于主模塊中。

5 運(yùn)行覆蓋檢測的二進(jìn)制文件

用“”構(gòu)建的二進(jìn)制-cover文件在執(zhí)行結(jié)束時(shí)將配置文件數(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
	$

請注意寫入目錄的兩個(gè)文件somedata:這些(二進(jìn)制)文件包含覆蓋率結(jié)果。有關(guān)如何從這些數(shù)據(jù)文件生成人類可讀結(jié)果的更多信息,請參閱以下有關(guān)報(bào)告的部分。

如果GOCOVERDIR未設(shè)置環(huán)境變量,覆蓋檢測的二進(jìn)制文件仍將正確執(zhí)行,但會發(fā)出警告。

6 小結(jié)

大多數(shù)程序使用內(nèi)置的構(gòu)建方法即可,可參考以下幾點(diǎn):

1 你的程序沒有用到 CGO 的 Golang 程序,直接用編譯器自帶的跨平臺特性即可全平臺編譯;

2 用到了 CGO 需要發(fā)布到ARM平臺的Golang程序,推薦自己配置ARM交叉編譯環(huán)境;

3 用到了 CGO 需要發(fā)布到Win/Linux/Mac平臺的Golang程序,推薦用使用go-ui-crossbuild 。

以上就是go程序執(zhí)行交叉編譯的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于go執(zhí)行交叉編譯的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go 語言中的死鎖問題解決

    Go 語言中的死鎖問題解決

    本文主要介紹了Go 語言中的死鎖問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 解決golang內(nèi)存溢出的方法

    解決golang內(nèi)存溢出的方法

    這篇文章主要介紹了解決golang內(nèi)存溢出的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Go語言入門之基礎(chǔ)語法和常用特性解析

    Go語言入門之基礎(chǔ)語法和常用特性解析

    這篇文章主要給大家講解了Go語言的基礎(chǔ)語法和常用特性解析,比較適合入門小白,文中通過代碼示例介紹的非常詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • go?time.After優(yōu)化后性能提升34%內(nèi)存減少67%

    go?time.After優(yōu)化后性能提升34%內(nèi)存減少67%

    這篇文章主要介紹了go語言time.After優(yōu)化后性能提升34%內(nèi)存減少67%實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • go語言中for?range使用方法及避坑指南

    go語言中for?range使用方法及避坑指南

    Go中的for range組合可以和方便的實(shí)現(xiàn)對一個(gè)數(shù)組或切片進(jìn)行遍歷,但是在某些情況下使用for range時(shí)很可能就會被"坑",下面這篇文章主要給大家介紹了關(guān)于go語言中for?range使用方法及避坑指南的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Golang必知必會之Go?Mod命令詳解

    Golang必知必會之Go?Mod命令詳解

    go mod可以使項(xiàng)目從GOPATH的強(qiáng)制依賴中獨(dú)立出來,也就是說你的項(xiàng)目依賴不再需要放在在GOPATH下面了,下面這篇文章主要給大家介紹了關(guān)于Golang必知必會之Go?Mod命令的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 詳解Go語言如何使用標(biāo)準(zhǔn)庫sort對切片進(jìn)行排序

    詳解Go語言如何使用標(biāo)準(zhǔn)庫sort對切片進(jìn)行排序

    Sort?標(biāo)準(zhǔn)庫提供了對基本數(shù)據(jù)類型的切片和自定義類型的切片進(jìn)行排序的函數(shù)。今天主要分享的內(nèi)容是使用?Go?標(biāo)準(zhǔn)庫?sort?對切片進(jìn)行排序,感興趣的可以了解一下
    2022-12-12
  • Golang中匿名組合實(shí)現(xiàn)偽繼承的方法

    Golang中匿名組合實(shí)現(xiàn)偽繼承的方法

    這篇文章主要介紹了Golang中匿名組合實(shí)現(xiàn)偽繼承的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Go語言七篇入門教程五文件及包

    Go語言七篇入門教程五文件及包

    本章節(jié)主要介紹go語言的文件處理與包管理,本文是Go語言七篇入門教程系列篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Jaeger?Client?Go入門并實(shí)現(xiàn)鏈路追蹤

    Jaeger?Client?Go入門并實(shí)現(xiàn)鏈路追蹤

    這篇文章介紹了Jaeger?Client?Go入門并實(shí)現(xiàn)鏈路追蹤的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評論