我們?cè)?code>linux上編譯帶有網(wǎng)絡(luò)功能的go
程序,得到的可執(zhí)行程序還是一個(gè)動(dòng)態(tài)鏈接程序,依賴(lài)系統(tǒng)中的libc
運(yùn)行,如果部署到服務(wù)器上,還是需要保證服務(wù)器的libc
版本不低于編譯平臺(tái)的libc
版本,否則有可能不能運(yùn)行。
要把go
程序編譯成真正的靜態(tài)可執(zhí)行文件,必須把libc
也靜態(tài)編譯進(jìn)可執(zhí)行文件中。下面我就以glibc-2.30
為例,演示一下怎么把libc
靜態(tài)編譯進(jìn)入go
程序。
第一步、從http://ftp.gnu.org/gnu/glibc/
下載源代碼glibc-2.30.tar.bz2
。
第二步、編譯安裝glibc
。假設(shè)glibc-2.30.tar.bz2
保存在HOME/src/glibc230
目錄中,目標(biāo)是把編譯好的glibc
安裝到/opt/glibc230
中,現(xiàn)在到該目錄中執(zhí)行下面的命令:
sudo mkdir /opt/glibc230
tar xvfj glibc-2.30.tar.bz2
#在 ubuntu18.04 中使用下面的命令配置 Makefile
./glibc-2.30/configure --prefix=/opt/glibc230
#在 ubuntu19.10 中使用下面的命令配置 Makefile
./glibc-2.30/configure --prefix=/opt/glibc230 --enable-cet
make
sudo make install
到這里已經(jīng)安裝好了 glibc-2.30
,可以在/opt/glibc230/lib
目錄中看到后綴為.a
的一些靜態(tài)庫(kù)。
第三步、編譯真正的靜態(tài)可執(zhí)行文件。
到你的go
程序目錄中執(zhí)行命令:
go build -ldflags '-s -w -L /opt/glibc230/lib -linkmode "external" -extldflags "-static"'
會(huì)顯示一些警告,但是不影響結(jié)果。