導航:首頁 > 源碼編譯 > go編譯執行過程

go編譯執行過程

發布時間:2024-08-11 04:01:12

1. Go 是怎麼使用 Go 來編譯自身的

是Go語言嗎?

Go 編譯過程 九個步驟

第一步. all.bash

%cd$GOROOT/src
%./all.bash

第一步 all.bash只是調用了另外兩個 shell 腳本:make.bash和run.bash。若使用 Windows 或 Plan 9,其過程也基本類似,只是腳本分別以 .bat 或 .rc 結尾。在文章的其他部分,請用適當的操作系統對應的擴展來補全命令



第二步. make.bash

../make.bash--no-banner

make.bash 作為 all.bash 內容的一部分,如果它退出也會中斷構建過程



第三步. cmd/dist

python">gcc-O2-Wall-Werror-ggdb-ocmd/dist/dist-Icmd/distcmd/dist/*.c

當健全檢查完成後,make.bash 開始編譯cmd/dist。




第四步. go_bootstrap

現在 go_bootstrap 已經構建完成,make.bash 的最後一步是使用 go_bootstrap 編譯完整的 Go 標准庫,包括一個完整的 go 工具用以替換。

echo"#$GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrapinstall-gcflags"$GO_GCFLAGS"
-ldflags"$GO_LDFLAGS"-vstd


第五步. run.bash

現在 make.bash 已經完成,回到 all.bash 的執行,這會調用 run.bash。run.bash 的任務是編譯和測試標准庫、運行時以及語言測試集。

bashrun.bash--no-rebuild

由於 make.bash 和 run.bash 都會調用 go install -a std,因此需要使用 –no-rebuild 標志來避免重復前面的步驟,–no-rebuild 跳過了第二個 go install。

#allowall.bashtoavoiddouble-buildofeverythingrebuild=trueif["$1"="--no-rebuild"];thenshiftelseecho'#Buildingpackagesandcommands.'timegoinstall-a-vstdechofi

第六步. go test -a std

php">echo'#Testingpackages.'
timegoteststd-short-timeout=$(expr120*$timeout_scale)s
echo

接下來 run.bash 會在標准庫里所有的包上來運行用 testing 包編寫的單元測試。由於 $GOPATH 和 $GOROOT 中有著相同的命名空間,所以不能直接使用 go test … 否則 $GOPATH 中的每個包也會被逐一測試,因此創建了一個用於標准庫中的包的別名:std。由於一些測試需要比較長的時間,且會消耗大量內存,因此用 -short 標志對一些測試進行了過濾。



第七步. runtime 和 cgo 測試

run.bash 接下來的部分會運行平台對 cgo 支持的測試,執行一些性能測試,並且編譯一些伴隨 Go 發行版一起的雜項程序。隨著時間的流逝,這些雜項程序的清單會越來越長,那麼它們也就會不可避免的被從編譯過程中悄悄剝離出去。

第八步. go run test

(xcd../test
unsetGOMAXPROCS
timegorunrun.go
)||exit$?

run.bash 的倒數第二步會調用在 $GOROOT 下的 test 目錄里的編譯器和運行時的測試。他們是對於編譯器和運行時自身的,較為低級細節的測試。會執行語言規格測試,test/bugs 和 test/fixedbugs 子目錄保存有那些已經被發現並被修復的問題的獨立的測試。驅動測試的是一個小 Go 程序 $GOROOT/test/run.go,會執行 test 目錄里的每個 .go 文件。一些 .go 文件的首行包含了指導 run.go 對結果作出判斷的指令,例如,程序將會失敗,或提供一個確定的輸出隊列。

第九步. go tool api

echo'#CheckingAPIcompatibility.'
gotoolapi-c$GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt
-next$GOROOT/api/next.txt-except$GOROOT/api/except.txt

run.bash 的最後一步調用了 api 工具。

2. 如何編譯armlinux的go

Golang也就是Go語言,現在已經發行到1.4.1版本了,語言特性優越性和背後Google強大靠山什麼的就不多說了。Golang的官方提供了多個平台上的二進制安裝包,遺憾的是並非沒有發布ARM平台的二進制安裝包。ARM平台沒辦法直接從官網下載二進制安裝包來安裝,好在Golang是支持多平台並且開源的語言,因此可以通過直接在ARM平台上編譯源代碼來安裝。整個過程主要包括編譯工具配置、獲取Golang源代碼、設置Golang編譯環境變數、編譯、配置Golang行環境變數等步驟。

註:本文選用樹莓派做測試,因為樹莓派是基於ARM平台的。

1、編譯工具配置

據說下個版本的golang編譯工具要使用golang自己來寫,但目前還是使用C編譯工具的。因此,首先要配置好C編譯工具:

1.1在Ubuntu或Debian平台上可以使用sudoapt-getinstallgcclibc6-dev命令安裝,樹莓派的RaspBian系統是基於Debian修改的,所以可以使用這種方法安裝。

1.2在RedHat或CentOS6平台上可以使用sudoyuminstallgcclibc-devel命令安裝。

安裝完成後可以輸入gcc--version命令驗證是否成功安裝。

2、獲取golang源代碼

2.1直接從官網下載源代碼壓縮包。

golang官網提供golang的源代碼壓縮包,可以直接下載,最新的1.4.1版本源代碼鏈接:/golang/go1.4.1.src.tar.gz

2.2使用git工具獲取。

golang使用git版本管理工具,也可以使用git獲取golang源代碼。推薦使用這個方法,因為以後可以隨時獲取最新的golang源代碼。

2.2.1首先確認ARM平台上已經安裝了git工具,可以使用git--version命令確認。一般linux平台都安裝了git,沒有的話可以自行安裝,不同平台的安裝方法可以參考:download/linux

2.2.2克隆遠程golang的git倉庫到本地

在終端cd到你想要安裝golang的目錄,確保該目錄下沒有名為go的目錄。然後以下命令獲取代碼倉庫:

gitclone/go

大陸地區可能會獲取失敗,在不翻牆的情況下我試了幾次都沒成功,原因大家都懂的。好在google已經將golang也託管到github上面,所以也可以通過下面命令獲取:

gitclone/golang/go.git

視網路情況,下載可能需要不少時間。我2M的帶寬花了將近兩個小時才下載完,雖然整個項目不過幾十兆==

下載完成後,可以看到目錄下多了一個go目錄,裡面即為golang的源代碼,在終端上執行cdgo命令進入該目錄。

執行下面命令檢出go1.4.1版本的源代碼,因為現在汪敏指已經有新的代碼提交上去了,最新的代碼可能不是最穩定的:

gitcheckoutgo1.4.1

至此,最新1.4.1發行版的源代碼獲取完畢

3、設置golang的編譯環境變數

主要有GOROOT、GOOS、GOARCH、GOARM四個環境變數需要設置,先解釋四個環境變數的意義。

3.1GOROOT

主要代表golang樹結構目錄的路徑,也就是上面git檢出的go目錄。一般可以不用設置這個環境變數,因為編譯的時候默認會以go目錄下src子目錄中的all.bash腳本困配運行時的父目錄作為GOROOT的值。為了保險起見,可以直接設拿芹置為go目錄的路徑。

3.2GOOS和GOARCH

分別代表編譯的目標系統和平台,可選值如下:

GOOSGOARCH

darwin386

darwinamd64

dragonfly386

dragonflyamd64

freebsd386

freebsdamd64

freebsdarm

linux386

linuxamd64

linuxarm

netbsd386

netbsdamd64

netbsdarm

openbsd386

openbsdamd64

plan9386

plan9amd64

solarisamd64

windows386

windowsamd64

需要注意的是這兩個值代表的是目標系統和平台,而不是編譯源代碼的系統和平台。樹莓派的RaspBian是linux系統,所以這些GOOS設置為linux,GOARCH設置為arm。

3.3GOARM

表示使用的浮點運算協處理器版本號,只對arm平台有用,可選值有5,6,7。如果是在目標平台上編譯源代碼,這個值可以不設置,它會自動判斷需要使用哪一個版本。

總結下來,在樹莓派上設置golang的編譯環境變數,可編輯$HOME/.bashrc文件,在末尾添加下面內容:

exportGOROOT=你的go目錄路徑

exportGOOS=linux

exportGOARCH=arm

編輯完後保存,執行source~/.bashrc命令讓修改生效。

4、編譯源代碼

環境變數配置完成自後就可以開始編譯源代碼。在go目錄下的src子目錄中,主要有all.bash和make.bash兩個腳本(另外還有兩個all.bat和make.bat腳本適用於window平台)。編譯實際上就是執行其中一個腳本,兩者的區別在於all.bash在編譯完成後還會執行一些測試套件。如果希望只編譯不測試,可以運行make.bash腳本。使用cd命令進入go下src目錄,執行./all.bash或者./make.bash命令即可開始編譯。由於硬體情況不同,編譯耗費的時間不同。在我的B型樹莓派編譯過程花費了將近半個小時,編譯完成後執行的測試套件又花費了差不多一個小時,總共花費了一個半小時左右。

5、配置golang運行環境變數

編譯完成後,go目錄下會生成bin目錄,裡面就是go的運行腳本。為了以後使用方法,可以將這個bin路徑添加到PATH環境變數中。同樣編輯~/.bashrc文件,因為前面設置過GOROOT環境變數指向go目錄了,所以只需要在末尾加上

exportPATH=$PATH:$GOROOT/bin

保存後同樣執行source~/.bashrc命令讓環境變數生效。

至此,golang源代碼編譯安裝成功。執行goversion應該就能看到當前golang的版本信息,表示編譯安裝成功。


3. golang 如何創建,編譯,打包go語言的源代碼和工程

1.最簡單的方法:
public static String reverse1(String str)
{ return new StringBuffer(str).reverse().toString();
}
2.最常用的方法:
public static String reverse3(String s)
{ char[] array = s.toCharArray();
String reverse = ""; //注意這是空串,不是null
for (int i = array.length - 1; i >= 0; i--)
reverse += array[i];
return reverse;
}
3.常用方法的變形:
public static String reverse2(String s)
{ int length = s.length();
String reverse = ""; //注意這是空串,不是null
for (int i = 0; i < length; i++)
reverse = s.charAt(i) + reverse;//在字元串前面連接, 而非常見的後面
return reverse;
}

4. go編譯整個文件夾

Copyright © 1999-2020, CSDN.NET, All Rights Reserved

打開APP

銀色種子
關注
go 編譯步驟 原創
2021-04-23 16:29:49

銀色種子

碼齡7年

關注

## go 步驟

```

/*
Go項目構建及編譯
一個Go工程中主要包含以下三個目錄:
src:源代碼文件
pkg:包文件
bin:相關bin文件

1: 建立工程文件夾 goproject
2: 在工程文件夾中建立src,pkg,bin文件夾
3: 在GOPATH中添加projiect路徑 例 e:/goproject
4: 如工程中有自己的包examplepackage,那在src文件夾下建立以包名命名的文件夾 例 examplepackage
5:在src文件夾下編寫主程序代碼代碼 goproject.go
6:在examplepackage文件夾中編寫 examplepackage.go 和 包測試文件 examplepackage_test.go
7:編譯調試包
go build examplepackage
go test examplepackage
go install examplepackage
這時在pkg文件夾中可以發現會有一個相應的操作系統文件夾如windows_386z,
在這個文件夾中會有examplepackage文件夾,在該文件中有examplepackage.a文件
8:編譯主程序
go build goproject.go
成功後會生成goproject.exe文件
至此一個Go工程編輯成功。
*/

閱讀全文

與go編譯執行過程相關的資料

熱點內容
android3d切換 瀏覽:748
資源管理器選定文件夾 瀏覽:987
分數公約數的演算法 瀏覽:588
yii2引入php文件 瀏覽:561
華為p20方舟編譯器評測 瀏覽:184
pntp伺服器是什麼 瀏覽:652
程序員培訓多長時間 瀏覽:556
求aaa的和python 瀏覽:191
python因子分析代碼 瀏覽:644
python啟動時提示沒有入口 瀏覽:678
linux中oracle監聽 瀏覽:618
程序員高價值朋友圈 瀏覽:486
雲伺服器做淘寶店 瀏覽:802
程序員判3年緩3年 瀏覽:909
伺服器雲監控系統 瀏覽:651
ios暴力解壓軟體 瀏覽:430
可以搜簡便演算法的軟體 瀏覽:200
各種的解壓小玩具 瀏覽:933
百度雲伺服器bcc域名綁定 瀏覽:486
android網路mp3格式 瀏覽:321