您的位置  > 互联网

静态链接库和动态链接器的含义和含义

首先我们来了解一下库和链接库的含义。

什么是链接库? 在计算机中,有些文件是专门用来存储可以重复使用的代码块的,比如具有实用功能的函数或者类。 我们通常称它们为库文件,或者简称为“库”()。

以C语言为例,函数库如下所示:

//myMath.c
int add(int a, int b) {
    return  a + b;
}
int sub(int a, int b) {
    return  a - b;
}
int mul(int a, int b) {
    return  a * b;
}
int div(int a, int b) {
    if (b != 0) {
        return a / b;
    }
    return -1;
}

.c文件包含4个函数,分别可以完成两个整数的加减乘除运算。 .c库文件的使用也非常简单。 只需将其添加到C语言项目中,就可以直接调用文件中的4个函数。 每个函数都可以被调用多次。

显然,在实际开发中引入别人编写的库文件可以省略某些功能的开发,提高项目的开发效率。 但不幸的是,像.c这样的“开源”库文件很难找到。 大多数程序员不直接共享源代码。 他们更喜欢共享库文件的二进制版本——链接库。

所谓链接库,其实就是将开源库文件(如上面提到的.c)编译打包得到的二进制文件。 链接库虽然是二进制文件,但它不能独立运行,必须等待其他程序调用它才能加载到内存中。

一个完整的C语言项目可能包含多个.c源文件,运行项目需要两个过程:“编译”和“链接”:

请注意,一个目标文件中使用的函数或变量可能会在其他目标文件或链接库文件中定义。 链接器有两种方式完成链接工作,即:

我们通常将第一种链接方式称为静态链接,所使用的链接库称为静态链接库; 第二种链接方法中,链接所有目标文件的方法仍然是静态链接,加载到内存后的链接操作称为动态链接,所使用的链接库称为动态链接库。

静态链接过程由静态链接器完成,动态链接过程由动态链接器完成。 链接器的实现机制与操作系统有关。 例如,在Linux平台上,动态链接器本质上就是一个动态链接库。

静态链接库和动态链接库 也就是说,程序有两种方式完成链接操作。 一是在生成可执行文件之前完成所有链接操作。 使用的库文件称为静态链接库; 另一种是把部分链接操作推迟到程序执行完毕。 这个过程中使用的库文件称为动态链接库。 1)静态链接库静态链接库用于将所有目标文件组织成可执行文件,生成的可执行文件可以独立运行。

使用静态链接库来完成链接操作有很多缺点。 首先,所有目标文件和静态链接库的指令和数据都被复制到可执行文件内部,文件本身就会很大。 当系统中有多个可执行文件链接同一个静态库时,每个可执行文件都包含静态库的指令和数据的副本,这会造成内存空间的巨大浪费。

另外,一旦程序中更新了某个模块,整个程序就必须重新链接才能运行。 假设一个程序由20个模块组成,每个模块的大小为1MB。 那么每次更新任何一个模块,用户都必须重新获取20MB的程序,这对用户来说非常不友好。

2)动态链接库 其实动态链接库就是平台上动态链接过程中使用的库文件的名称。 在Linux平台上,习惯上称其为共享库或共享对象文件。 它们表达的是同样的意思。

所谓动态链接是指将链接时机延迟到程序运行时。 具体来说,对于以动态链接方式运行的项目,静态链接器首先将所有目标文件组织成可执行文件,然后在运行时将所需的所有动态链接库加载到内存中,这是由动态链接器完成的。 可执行文件和动态库文件的链接。

动态链接库可以与可执行文件一起加载到内存中,也可以在可执行文件运行过程中加载。 即当需要可执行文件时,动态链接库就会被加载到内存中。

与静态链接库相比,动态链接库可以很好地解决空间浪费和更新困难的问题。 动态链接库和可执行文件分别加载到内存中,因此动态链接库的大小通常较小。 当多个程序使用同一个动态链接库时,所有程序可以共享动态链接库的指令和数据,避免空间的浪费。 使用动态链接还可以方便程序的更新和升级。 当程序的某个模块更新时,只需更换旧模块即可。 当程序运行时,所有模板都会自动加载到内存中并动态链接在一起。

有读者可能会问,如果使用动态链接的话,每次程序运行时都需要重新链接。 会不会很慢? 诚然,动态链接确实会损失部分程序性能,但实践证明,与静态链接相比,动态链接库的性能损失大约在5%以内。 这对于换取程序的节省空间和更新的方便是相当值得的。 的。

了解了静态链接库和动态链接库之后,我们继续学习如何创建它们。