《程序员的自我修养》阅读笔记(四)

本文介绍了链接(Linking)的基本概念及其在程序编译过程中的作用。链接是指将多个源文件组合成一个可执行文件的过程,主要解决函数地址不确定的问题。文章通过C语言示例解释了如何引用外部函数,并探讨了Python中模块间引用的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上次没写链接,原以为会和其他部分一样只有几页,没想到这本书一大半都是在讲链接背后的原理。那么就慢慢看吧~

链接

链接(Linking),顾名思义,就是将文件相互连接起来。为什么要链接呢?在写代码时我们经常会引用到外部函数,打个比方,在c语言中要使用rand()函数,则要:

#include <stdio.h>
#include <stdlib.h>

int main(){

    int a = rand();
    printf("%d\n",a);
    return 0;

}

对于这段代码,看起来我们引用了两个头文件,stdio.h和stdlib.h。此外在项目中,我们也往往会有很多文件,这些文件之间相互引用,那么在代码写完后,将程序转化为可执行文件时,机器就需要通过这些引用的内容来处理二进制文件最终的样子。

机器在执行一个函数时需要先找到函数对应的地址,然而,代码不是一成不变的,我们总是会添加或者删除一些内容,因此代码的汇编地址也是会发生变化的(所以需要编译的语言每次修改后都要重新编译),那么当机器将一个文件外部的函数写成汇编时,它是不知道这个函数的地址的,所以会先搁置这部分,等到链接阶段再处理。

//fun.py
def func(a:int):
    a += 1
//main.py
import fun

if __name__ == "__main__":
    num = 0
    fun.func(num)

当所有文件都编译完后,它们被放到一块,进行链接。在这时链接器会挨个地查找外部引用函数的地址,然后将编译过程中搁置的内容补全。最终,所有用到了的内容会被打包到一起,输出为一个可执行文件,在这个文件中这些引用的函数等都会被具体地确定下来,因此程序执行时只需要找到固定的地址就行了。

 后续还有很多和链接有关的内容,包括静态链接和动态链接等等,那么就下次一定吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值