詳解大廠工程師都喜歡用的源碼編譯三步曲
作為一個(gè)有實(shí)戰(zhàn)經(jīng)驗(yàn)的運(yùn)維老手都知道,部署軟件有多種方式,比如yum/apt包管理器方式,二進(jìn)制方式,源碼包編譯,當(dāng)然還有容器化Docker部署,Kubernetes方式部署。
相對(duì)于包管理器和二進(jìn)制方式部署,源碼編譯就相對(duì)復(fù)雜一點(diǎn),但可以實(shí)現(xiàn)定制化,安全性更高,更可控。

下面就詳細(xì)介紹一下源碼包安裝的三部曲:
./configure
make
make install其實(shí)很多人到工作三五年了,都沒真正理解過這三行命令的意義。 今天我們就來(lái)把它講透,并告訴你為什么在大廠,源碼編譯反而比一鍵安裝更受歡迎。
第一步: ./configure
源碼一般會(huì)自帶一個(gè) configure 腳本(通常由 autoconf 工具生成)。它的主要作用是:
檢查系統(tǒng)環(huán)境:
- 是否存在所需依賴庫(kù)(比如 zlib、openssl)不存在就需要安裝;
- 編譯器和工具鏈?zhǔn)欠窨捎茫ㄈ?nbsp;gcc、g++、ld);
- 操作系統(tǒng)特性(Linux、BSD、macOS 可能不同)。
生成 Makefile:
- 根據(jù)檢查結(jié)果動(dòng)態(tài)生成配置文件(常見是 config.h 和 Makefile);
- 不同環(huán)境下可能選擇不同的宏定義、優(yōu)化選項(xiàng)和依賴鏈接。
常見參數(shù):
./configure --prefix=/usr/local # 指定安裝路徑
./configure --with-ssl # 開啟 SSL 支持
./configure --disable-shared # 禁用動(dòng)態(tài)庫(kù)底層原理:configure 會(huì)調(diào)用 autoconf、automake 等工具生成一系列 shell 腳本檢測(cè),比如通過 AC_CHECK_LIB 測(cè)試庫(kù)是否存在,最后拼接出一份適合你系統(tǒng)的 Makefile。
第二步: make
有了 Makefile,make 工具就知道如何把源碼一步步編譯成目標(biāo)文件。
核心機(jī)制:依賴解析
- make 會(huì)讀取 Makefile,解析各個(gè)目標(biāo)(target)的依賴關(guān)系;
- 如果某個(gè) .c 文件被修改,只會(huì)重新編譯相關(guān)的 .o,而不是整個(gè)項(xiàng)目。
執(zhí)行規(guī)則一個(gè)典型的 Makefile 規(guī)則如下:
main.o: main.c main.h
gcc -c main.c -o main.o- 左邊是目標(biāo)(main.o);
- 右邊是依賴文件(main.c, main.h);
- 下方命令是實(shí)際執(zhí)行的動(dòng)作。
并行編譯make -jN 可以開啟 N 個(gè)線程并行編譯,大幅縮短構(gòu)建時(shí)間。
make -j8執(zhí)行過程一般為:源文件(.c/.cpp) → 編譯器 → 目標(biāo)文件(.o/.obj) → 鏈接器 → 可執(zhí)行文件
第三步: make install
編譯完成后,程序和庫(kù)文件還停留在源碼目錄中。
make install 會(huì)按照 Makefile 中定義的規(guī)則,將文件拷貝到系統(tǒng)標(biāo)準(zhǔn)目錄:
- 可執(zhí)行文件 → /usr/local/bin/
- 動(dòng)態(tài)庫(kù) → /usr/local/lib/
- 頭文件 → /usr/local/include/
- 配置文件 → /usr/local/etc/
如果在 configure 階段指定了 --prefix,安裝位置會(huì)發(fā)生改變,例如:
./configure --prefix=/data/nginx
make
make install
舉幾個(gè)大廠常用的例子:
- Nginx: 包管理器版本往往精簡(jiǎn),HTTP/2、stream、Lua 模塊可能沒有,需要源碼編譯才能開啟。
- MySQL / MariaDB: 特定存儲(chǔ)引擎(MyRocks、TokuDB)必須源碼編譯才支持。
- PHP: 根據(jù)項(xiàng)目需求啟用 --with-fpm、--with-opcache,可大幅提升性能。
- Redis: 最新版本的特性(比如 I/O 多線程)常常要通過源碼第一時(shí)間獲取。
- OpenSSL: 安全補(bǔ)丁更新極快,源碼編譯是最快的修復(fù)方式。
在真實(shí)生產(chǎn)環(huán)境里,想要性能調(diào)優(yōu)、功能裁剪、快速響應(yīng)漏洞,源碼編譯幾乎是標(biāo)配。
當(dāng)然平時(shí)測(cè)試環(huán)境或業(yè)務(wù)量不是很大的,用包管理或二進(jìn)制部署更加快速,不用弄那么復(fù)雜,也可以用Docker或Kubernetes部署。本文只是想讓大家了解一下源碼編譯安裝的原理。





















