静态链接和动态连接初步了解

本文详细介绍了编译过程的三个步骤:预处理、编译和汇编,以及静态链接和动态链接的区别。静态链接在程序执行前合并库函数,形成独立的可执行文件,但可能导致文件体积过大;动态链接则在运行时加载库,节省空间但可能影响移植性。静态链接库是一组目标文件的集合,而动态链接库在内存中只有一份,供多个程序共享。
摘要由CSDN通过智能技术生成

一、编译过程

     编译分为3步,首先对源文件进行预处理,这个过程主要是处理一些#号定义的命令或语句(如宏、#include、预编译指令#ifdef等),生成*.i文件;然后进行编译,这个过程主要是进行词法分析、语法分析和语义分析等,生成*.s的汇编文件;最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件。
二、链接过程(静态链接和动态链接)

     两种连接方式最大的区别就在于链接的时机不一样,静态链接实在形成可执行程序前,动态链接是在程序执行时。

从源文件到可执行文件的过程示意:

 一、静态链接库

1、静态链接:在连接阶段,将源文件需要用到的库函数与经过汇编生成的目标文件.o合并成可执行文件。好处:方便移植,可执行程序(在C语言中可执行程序就是经过了编译和链接转化成了二进制代码)与库函数无联系。缺点:文件太大,往往实现一个小功能就要占用很大空间,很不方便。

2、静态链接概念: 在我们的实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,即每个*.c文件会形成一个*.o文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,从而形成一个可以执行的程序。这个链接的过程就是静态链接
3、静态链接原理:由很多目标文件进行链接形成的是静态库,反之静态库也可以简单地看成是一组目标文件的集合,即很多目标文件经过压缩打包后形成的一个文件

二、动态链接库

1、概念:当两个程序只应用一个库,这个目标文件在内存中只有一份,供所有程序使用。优点:在程序运行过程中动态调用库文件,很方便,又不占空间。缺点:移植性太差。如果两台电脑运行环境不同,动态库存放位置不一样,很可能导致程序库运行失败。

2、原理:动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。比如:对于静态编译的程序1和程序2,都应用库staticMath。在内存中就又两份相同的staticMath目标文件,很浪费空间,一旦程序数量过多就很可能会内存不足。这么大的内存才只能运行这几个程序,实在不甘心。这样就又了动态库发挥威力的地方了。我们来看看动态链接的结果:

 


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值