golang是一種編譯型語言,通常情況下,我們只需要在對應平台編譯一次即可得到可執行文件進行部署。但是在實際應用中,我們會遇到需要在其他平台上運行的情況。此時,golang交叉編譯就能派上用場了。本篇文章將從多個方面對golang交叉編譯進行詳細闡述。
一、golang交叉編譯arm
在嵌入式設備中,常常會使用ARM平台,這時候需要對golang進行交叉編譯。在linux系統下,可以按照以下步驟進行操作:
target=arm-linux-gnueabi
export GOARCH=arm
export GOARM=7
export GOOS=linux
export CGO_ENABLED=0
export CC=${target}-gcc
go build -o my_binary
其中,target是交叉編譯器的前綴,GOARCH是目標平台的架構類型,GOARM是目標設備的ARM版本,GOOS表示目標操作系統,CGO_ENABLED表示使用cgo進行編譯(有些情況下可能需要用到),CC是指定交叉編譯器。
二、golang交叉編譯 cgo
如果項目中使用了cgo,那麼在進行交叉編譯時,我們需要將所有的C代碼和頭文件一併編譯為.so文件,然後在交叉編譯的時候使用。在這裡我們推薦使用docker進行交叉編譯,具體步驟如下:
docker run --rm -v $(pwd):/build -w /build -e GOOS=linux -e GOARCH=arm64 golang:1.15 go build -v -buildmode=c-shared -o hello.so main.go
其中$(pwd)表示宿主機當前目錄,-v將宿主機目錄掛在到容器中,-w時容器的工作路徑,-e設置環境變量,GOOS和GOARCH指定目標平台,-buildmode=c-shared將代碼打包為.so文件。最後將生成的.so文件,放到交叉編譯目錄的相應位置即可。
三、golang交叉編譯原理
golang交叉編譯的原理是通過使用交叉編譯器對golang代碼進行編譯,在指定平台上生成可執行文件。具體來說,golang會通過環境變量GOARCH、GOOS、CGO_ENABLED、CC等來控制編譯器的行為,編譯器會根據這些變量,選用正確的工具鏈進行編譯。在編譯過程中,編譯器還會生成一些系統默認的頭文件和庫文件,方便程序在目標平台上進行使用。
四、golang交叉編譯goland
goland是JetBrains公司推出的一款針對golang的IDE,為開發者提供了很好的編碼、調試、測試工具。同時,goland還提供了交叉編譯功能,可以非常方便地在IDE中進行交叉編譯。具體步驟如下:
- 進入Settings>Go>Build Tags & Vendoring
- 添加需要交叉編譯支持的目標平台標籤,例如: !darwin !amd64 表示不編譯mac平台和64位架構。
- 切換到需要編譯的平台
- Build>Build file 或者 Cli
五、golang交叉編譯 海思
海思(HiSilicon)是華為公司的一個半導體品牌,常被用於物聯網相關設備的開發中。在進行海思上程序開發時,我們也需要將golang代碼進行交叉編譯。交叉編譯海思平台的具體步驟如下:
export GOPATH=
export PATH=$PATH:$GOPATH/bin
export GOOS=linux
export GOARCH=arm
export GOARM=5
export CGO_ENABLED=0
export CC=arm-himix100-linux-gcc
go build -a my_http_server.go
其中,GOOS、GOARCH和CGO_ENABLED的取值和前面一樣,CC指向海思平台交叉編譯器,此處以himax100為例,go build 用於編譯項目,並生成可執行文件。
六、golandarm交叉編譯
在goland中進行arm交叉編譯時,會遇到類似:cannot find package “github.com/labstack/echo” in any of
錯誤的情況。這時候需要在命令行中設置GOROOT和GOPATH,具體命令如下:
GOROOT=/usr/local/Cellar/go/1.16.6/libexec \
GOPATH=/Users/xxx/go \
GOOS=linux \
GOARCH=arm \
GOARM=5 \
CGO_ENABLED=0 \
go build -x -v -o bin/build_1.0.0_linux_arm main.go
以上設置中,GOROOT使用了golang安裝路徑,在macOs這個路徑通常是:/usr/local/Cellar/go/1.16.6/libexec,GOPATH是golang的工作路徑,GOOS、GOARCH、GOARM和CGO_ENABLED與前面介紹的一致。go build用於編譯預料中的程序(main.go),-x表示顯示執行的命令,-v表示顯示編譯過程。
七、交叉編譯configure選項
在進行golang交叉編譯時,configure選項也是很常用的一種方式,通常我們可以使用GOOS、GOARCH來設置選項,具體configure可用選項請參考官方文檔。下面是一個交叉編譯到Linux平台時的configure例子:
./configure --prefix=/usr/local --build=x86_64-linux-gnu --host=x86_64-linux-gnu \
CC=x86_64-linux-gnu-gcc CXX=x86_64-linux-gnu-g++ \
GOOS=linux GOARCH=amd64 CGO_ENABLED=0
其中,prefix表示安裝路徑,build表示編譯主機的平台,host表示目標平台,CC和CXX用於指定C和C++編譯器,GOOS、GOARCH和CGO_ENABLED表示使用GO_TAGS參數指定編譯參數。
八、go交叉編譯linux
對於go交叉編譯到Linux平台,可以通過在Linux上安裝依賴包和交叉編譯器的方式來解決,具體步驟如下:
sudo apt update
sudo apt install build-essential gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf
GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=arm-linux-gnueabihf-gcc go build app.go
其中,sudo apt update用於更新系統依賴,sudo apt install build-essential gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf用於安裝系統依賴和交叉編譯器,GOOS、GOARCH和CGO_ENABLED表示使用GO_TAGS參數指定編譯參數,GOARM用於指定ARM平台版本,CC用於指定交叉編譯器。
總結
通過以上的介紹,相信大家已經對golang交叉編譯有了較為深入的了解。在實際的開發中,我們經常會遇到需要在其他平台上運行golang程序的場景,golang交叉編譯正是解決這一問題的好方法。如果大家在使用golang交叉編譯時,還有什麼疑問或意見,歡迎留言交流。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/279712.html