Gin實踐 番外 Golang交叉編譯

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

Golang交叉編譯

項目地址:https://github.com/EDDYCJY/go... (快上車,支援一波)

原文地址:https://segmentfault.com/a/11...

前言

在 連載九 講解構建Scratch鏡像時,我們編譯可執行檔用了另外一個形式的命令,不知道你有沒有疑問?

$ CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o go-gin-example .

說明

我們將講解命令各個參數的作用,希望你在閱讀時,將每一項串聯起來,你會發現這就是交叉編譯相關的小知識

也就是 Golang 令人心動的特性之一跨平台編譯

一、CGO_ENABLED

作用:

用於標識(聲明) cgo 工具是否可用

意義:

存在交叉編譯的情況時,cgo 工具是停用。在標準go命令的上下文環境中,交叉編譯意味著程式構建環境的目標計算架構的標識與程式運行環境的目標計算架構的標識不同,或者程式構建環境的目標作業系統的標識與程式運行環境的目標作業系統的標識不同

小結:

結合案例來說,我們是在宿主機編譯的可執行檔,而在 Scratch 鏡像啟動並執行可執行檔;顯然兩者的電腦架構、運行環境標識你無法確定它是否一致(畢竟構建的 docker 鏡像還可以給他人使用),那麼我們就要進行交叉編譯,而交叉編譯不支援 cgo,因此這裡要禁用掉它

關閉 cgo 後,在構建過程中會忽略 cgo 並靜態連結所有的依賴庫,而開啟 cgo 後,方式將轉為動態連結

補充:

golang 是預設開啟 cgo 工具的,可執行 go env 命令查看

$ go envGOARCH="amd64"GOBIN=""GOCACHE="/root/.cache/go-build"GOEXE=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"...GCCGO="gccgo"CC="gcc"CXX="g++"CGO_ENABLED="1"...

二、GOOS

用於標識(聲明)程式構建環境的目標作業系統

如:

  • linux
  • windows

三、GOARCH

用於標識(聲明)程式構建環境的目標計算架構

若不設定,預設值與程式運行環境的目標計算架構一致(案例就是採用的預設值)

如:

  • amd64
  • 386
系統 GOOS GOARCH
Windows 32位 windows 386
Windows 64位 windows amd64
OS X 32位 darwin 386
OS X 64位 darwin amd64
Linux 32位 linux 386
Linux 64位 linux amd64

四、GOHOSTOS

用於標識(聲明)程式運行環境的目標作業系統

五、GOHOSTARCH

用於標識(聲明)程式運行環境的目標計算架構

六、go build

-a

強制重新編譯,簡單來說,就是不利用緩衝或已編譯好的部分檔案,直接所有包都是最新的代碼重新編譯和關聯

-installsuffix

作用:

在軟體包安裝的目錄中增加尾碼標識,以保持輸出與預設版本分開

補充:

如果使用 -race 標識,則尾碼就會預設設定為 -race 標識,用於區別 race 和普通的版本

-o

指定編譯後的可執行檔名稱

小結

大部分參數指令,都有一定關聯性,且與交叉編譯的知識點相關,可以好好品味一下

最後可以看看 go build help 加深瞭解

$ go help buildusage: go build [-o output] [-i] [build flags] [packages]...    -a        force rebuilding of packages that are already up-to-date.    -n        print the commands but do not run them.    -p n        the number of programs, such as build commands or        test binaries, that can be run in parallel.        The default is the number of CPUs available.    -race        enable data race detection.        Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.    -msan        enable interoperation with memory sanitizer.        Supported only on linux/amd64,        and only with Clang/LLVM as the host C compiler.    -v        print the names of packages as they are compiled.    -work        print the name of the temporary work directory and        do not delete it when exiting.    -x        print the commands.    -asmflags '[pattern=]arg list'        arguments to pass on each go tool asm invocation.    -buildmode mode        build mode to use. See 'go help buildmode' for more.    -compiler name        name of compiler to use, as in runtime.Compiler (gccgo or gc).    -gccgoflags '[pattern=]arg list'        arguments to pass on each gccgo compiler/linker invocation.    -gcflags '[pattern=]arg list'        arguments to pass on each go tool compile invocation.    -installsuffix suffix        a suffix to use in the name of the package installation directory,        in order to keep output separate from default builds.        If using the -race flag, the install suffix is automatically set to race        or, if set explicitly, has _race appended to it. Likewise for the -msan        flag. Using a -buildmode option that requires non-default compile flags        has a similar effect.    -ldflags '[pattern=]arg list'        arguments to pass on each go tool link invocation.    -linkshared        link against shared libraries previously created with        -buildmode=shared.    -pkgdir dir        install and load all packages from dir instead of the usual locations.        For example, when building with a non-standard configuration,        use -pkgdir to keep generated packages in a separate location.    -tags 'tag list'        a space-separated list of build tags to consider satisfied during the        build. For more information about build tags, see the description of        build constraints in the documentation for the go/build package.    -toolexec 'cmd args'        a program to use to invoke toolchain programs like vet and asm.        For example, instead of running asm, the go command will run        'cmd args /path/to/asm <arguments for asm>'....

參考

本系列範例程式碼

  • go-gin-example

書籍

  • Go並發編程實戰 第二版
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.