认知篇 | 源代码自编译,到底是在编译什么?

当你在操作系统yum源上没有找到现成的rmp包,这时候可找找github或gitee找到源码进行自编译的方式部署自个想要的软件。

那么源码自编译都在干些什么?今天讲解之。

“源代码自编译” 中的 “编译”,指的是将人可读的编程语言源代码,转换为计算机可执行的机器码(二进制文件)的整个过程。

可比作“从菜谱到成品蛋糕” 的过程:

源代码= 一份用英文(或C/Python/Go等语言)写的菜谱。

编译器/编译工具链 =厨师和厨房设备。

编译过程=厨师阅读菜谱,准备食材,操作设备,进行混合、烘烤等一系列动作。

最终的可执行文件=做好的、可以直接吃的蛋糕。

编译具体在“编译”什么?—— 分解“黑箱”

当运行./configure && make && make install 或 cargo build、go build 时,这个“黑箱”内部通常包含以下几个关键阶段:

1. 预处理

做什么:处理源代码中以# 开头的指令(如 #include#define)。

结果:将引入的头文件内容插入源代码,展开宏定义,生成一个“纯净”的、待编译的中间代码文件。

类比:厨师拿到菜谱,先把其中“参见附录A”的部分(头文件)找出来,把“糖少许”根据定义替换成“糖15克”(宏展开),整理成一份没有引用、所有步骤都清晰列出的完整操作清单。

2. 编译(狭义)

做什么:将预处理后的高级语言代码,翻译成低级语言——汇编语言。这是最核心的“翻译”步骤。

结果:生成与特定CPU架构(如x86, ARM)相关的汇编代码文件(.s 文件)。

类比:厨师把整理好的英文操作清单,翻译成厨房设备能理解的一系列基础操作指令(“启动烤箱,设定180度”、“用3档搅拌5分钟”)。

3. 汇编

做什么:将汇编语言代码,翻译成机器可以识别的二进制指令——机器码。

结果:生成目标文件(.o 或 .obj 文件)。这个文件已经是二进制格式,但还不能直接运行。

类比:把那些基础操作指令,转换成设备控制面板能直接接收的、由0和1组成的电信号序列。

4. 链接

做什么:这是最后也是最关键的一步。一个程序通常由多个源文件(多个.o 目标文件)组成,并且会用到系统的标准库(如 libc.so)或第三方库。

链接器的工作就是把所有相关的目标文件“拼接”在一起

1.解决函数和变量在不同文件之间的引用关系(在A文件调用了B文件里的函数,链接器要找到这个函数在哪)。

2.将库文件(动态库或静态库)的代码“链接”进来。

3.结果:生成最终的、完整的可执行文件或动态/静态库文件。

为什么要编译?

与从源代码编译相比,另一种方式是直接下载“预编译好的二进制包”(如 Windows 的 .exe, macOS 的 .dmg, Linux 的 .deb/.rpm 包)。自编译的主要动机包括:

1. 性能优化:编译时可以针对机器的CPU型号(如 -march=native)进行优化,开启更激进的优化选项,理论上能获得更快的执行速度。

2. 定制功能:可以通过配置选项,启用或禁用某些功能模块。例如,编译 Vim 时可以去掉不用的特性,或者为 Nginx 添加特定的第三方模块。

3. 获取最新版本:官方仓库的软件版本可能较旧,编译可以立刻用到最新特性或安全修复。

4. 适配特殊环境:在非主流Linux发行版、嵌入式系统或容器等受限环境中,可能没有现成的二进制包,必须编译。

5. 学习和调试:可以修改源代码,加入调试信息,或者研究其构建过程。

举个栗子:Patchelf 本身

假设在一个老旧的Linux 系统上,想使用新版本 Patchelf 的功能,但系统仓库里没有。可以:

1. 下载源码包:从 GitHub 获取 patchelf-0.15.0.tar.gz。

2. 解压并进入目录。

3. 运行 ./configure:检查的系统环境,生成适配的 Makefile。

4. 运行 make:这个命令会触发上述编译、汇编、链接 的完整流程,调用 g++ 等工具,最终在 src/ 目录下生成一个名为 patchelf 的可执行二进制文件。

5. (可选)sudo make install:将这个刚编译好的 patchelf 二进制文件复制到系统路径(如 /usr/local/bin)下,方便全局使用。

文章小结

源代码自编译,就是在的机器上,充当“厨师”的角色,利用编译器这套“厨房设备”,将源代码这份“菜谱”,从头到尾加工成“可以直接吃的蛋糕”——即可执行二进制文件。编译的对象是源代码,得到的成果是机器码,而整个过程是一个包含预处理、编译、汇编、链接的精密流水线。

文章至此。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值