在Linux系统中,编译源码是软件安装和部署过程中经常出现的操作,和Windows系统直接运行安装程序、Linux发行版使用包管理器安装预编译包的逻辑不同,编译源码需要用户手动处理代码的编译、链接等流程,这种方式在很多场景下有着不可替代的作用。

适配当前系统硬件架构
预编译的软件包通常是针对通用硬件架构制作的,比如常见的x86_64架构,为了保证兼容性,编译时不会开启针对特定CPU的优化指令集。而编译源码时,编译器可以根据当前系统的CPU型号,自动启用对应的优化选项,比如针对Intel的AVX指令集、AMD的相应优化指令,让软件运行时的计算效率更高,尤其对计算密集型软件的提升非常明显。
以编译Nginx为例,我们可以通过configure脚本指定优化参数,让编译出的二进制文件更适配当前服务器硬件:
# 进入Nginx源码目录 cd nginx-1.25.3 # 指定优化参数,开启针对当前CPU的优化 ./configure --prefix=/usr/local/nginx --with-cc-opt="-march=native -O3" # 编译并安装 make && make install
按需定制软件功能
很多开源软件提供了丰富的功能模块,预编译包为了保证通用性,通常只会开启常用的基础模块,很多进阶功能会被默认关闭。而编译源码时,我们可以通过配置脚本自由选择需要开启或关闭的功能,避免安装不需要的模块占用系统资源,也能开启预编译包没有提供的特殊功能。
比如编译PHP时,我们可以按需选择要安装的扩展,不需要的扩展可以不编译进最终的程序中:
# 进入PHP源码目录 cd php-8.2.11 # 只开启需要的扩展,关闭不需要的功能 ./configure --prefix=/usr/local/php --with-mysqli --with-pdo-mysql --without-pear # 编译安装 make && make install
获取最新或特定版本软件
Linux发行版的官方软件源更新速度通常比较保守,为了保证系统稳定性,源里的软件版本往往不是最新的。如果我们需要使用软件的最新功能,或者需要使用某个特定的历史版本,而官方源没有提供对应的安装包,这时候编译源码就是最直接的方式。只需要从软件官方仓库拉取对应版本的源码,就可以完成安装。
比如我们需要安装最新版的Redis,而系统源里的Redis版本比较旧,就可以通过编译源码的方式安装:
# 下载最新版Redis源码 wget https://download.redis.io/redis-stable.tar.gz # 解压源码包 tar -zxvf redis-stable.tar.gz cd redis-stable # 编译源码 make # 安装到系统 make install
修复软件已知问题
当使用的软件出现了bug,而官方还没有发布包含修复的新版本安装包,或者预编译包没有包含对应的修复补丁时,我们可以获取软件的源码,手动打上修复补丁之后再编译安装,快速解决当前遇到的问题,不需要等待官方发布新的安装包。
学习软件运行原理
编译源码的过程中,我们可以查看软件的完整源代码,了解软件的模块组成、运行逻辑,还能修改源码调整软件的行为,对于想要深入学习软件原理、进行二次开发的用户来说,编译源码是必经的过程。
编译源码的基本流程
大部分Linux下的开源软件编译流程都比较统一,通常分为三个步骤:
- 配置阶段:运行
configure脚本或者cmake等工具,检查系统依赖,生成适配当前系统的编译配置文件,同时可以指定安装路径、功能模块等参数。 - 编译阶段:使用
make工具调用编译器(通常是gcc),按照配置阶段生成的规则将源码编译成可执行的二进制文件。 - 安装阶段:运行
make install命令,将编译好的二进制文件、配置文件、依赖库等复制到系统的指定目录,完成软件安装。
下面是一个通用的编译源码示例:
# 解压源码包 tar -zxvf software-1.0.tar.gz cd software-1.0 # 配置编译参数 ./configure --prefix=/usr/local/software # 编译 make -j4 # 安装 make install
需要注意的是,编译源码之前需要先安装对应的编译工具链,比如gcc、make、cmake等,还有软件运行需要的依赖库,否则配置或者编译阶段会报错。