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程序