golang 的編譯(不涉及 cgo 編譯的前提下)預設使用了靜態編譯,不依賴任何動態鏈結庫。
這樣可以任意部署到各種執行環境,不用擔心依賴庫的版本問題。只是體積大一點而已,儲存時占用了一點磁碟,執行時,多占用了一點記憶體。早期動態鏈結庫的產生,是因為早期的系統的記憶體資源十分寶貴,由於記憶體緊張的問題在早期的系統中顯得更加突出,因此人們首先想到的是要解決記憶體使用效率不高這一問題,於是便提出了動態裝入的思想。也就產生了動態鏈結庫。在現在的計算機裡,作業系統的硬碟記憶體更大了,尤其是伺服器,32g、64g 的記憶體都是最基本的。可以不用為了節省幾百 kb 或者1m,幾 m 的記憶體而大大費周折了。而 golang 就採用這種做法,可以避免各種 so 動態鏈結庫依賴的問題,這點是非常值得稱讚的。
顯示指定靜態編譯方法
在docker化的今天, 我們經常需要靜態編譯乙個go程式,以便方便放在docker容器中。 即使你沒有引用其它的第三方包,只是在程式中使用了標準庫net
,你也會發現你編譯後的程式依賴glic,這時候你需要glibc-static庫,並且靜態連線。
不同的go版本下靜態編譯方式還有點不同,在go 1.10下, 下面的方式會盡可能做到靜態編譯:
cgo_enabled=0 go build -a -ldflags '-extldflags "-static"
' .
參考:1. golang語言編譯的二進位制可執行檔案為什麼比 c 語言大
2. 完全靜態編譯乙個go程式
Golang 編譯 條件編譯
條件編譯 標籤編譯 build tag build build linux and 386 or darwin and not cgo 以 開始,例如 build 支援 goos 與 goarch 並可以具有多個值,用 分割,例如 build linux,darwin,freebsd 支援 不等條件...
golang交叉編譯
golang交叉編譯 golang 支援交叉編譯,在乙個平台上生成另乙個平台的可執行程式 mac 下編譯 linux 和 windows 64位可執行程式 cgo enabled 0 goos linux goarch amd64 go build main.go cgo enabled 0 goo...
golang條件編譯
golang中沒有類似c語言中條件編譯的寫法,比如在c 中可以使用如下語法做一些條件編譯,結合巨集定義來使用可以實現諸如按需編譯release和debug版本 的需求 ifndef define end但是golang支援兩種條件編譯方式 在源 裡新增標註,通常稱之為編譯標籤 build tag 編...