golang靜態編譯


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM