ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动态链接库和静态链接库笔记

2022-09-14 12:30:26  阅读:171  来源: 互联网

标签:文件 int 链接库 笔记 静态 动态链接库 链接


编程语言中,常常将包含大量函数(类、方法)的文件称为库文件。库文件是最常用的共享代码的方式,根据使用方法的不同,库文件可以分为静态链接库(简称“静态库文件”或者“静态库”)和动态链接库(“动态库文件”或者“动态库”)两种。

静态链接库和动态链接库的作用时机不同

  • 静态链接库会在程序载入内存之前完成所有的链接操作
  • 而动态链接库是在程序载入内存后再进行链接操作

在不同的平台(操作系统)上,静态库和动态库的创建方式不同,使用方式也不尽相同,我们将从 Windows 和 Linux 两个平台分别介绍创建和使用它们的过程。

阅读完本专题,你可以找到以下这些问题的答案:

  • 什么是,什么是链接库
  • 链接库为什么会有“静态”和“动态”之分?
  • 静态链接库和动态链接库的功能和用法
  • 如何创建一个静态链接库和动态链接库?
  • 如何在自己的项目中引入第三方提供的静态链接库和动态链接库?

 

 

 

链接库是什么(动态链接库和静态链接库)

计算机中,有些文件专门用于存储可以重复使用的代码块,例如功能实用的函数或者类,我们通常将它们称为库文件,简称“库”(Library)

以 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;
}

myMath.c 文件中包含 4 个函数,它们分别可以完成两个整数的加法、减法、乘法和除法运算。myMath.c 库文件的用法也很简单,直接将它添加到某一个 C 语言项目中,就可以直接调用文件中的 4 个函数,每个函数可以调用多次。

显然,实际开发中引入他人编写好的库文件可以省略某些功能的开发环节,提高项目的开发效率。但遗憾的是,类似 myMath.c 这种“开源”的库文件很难找到,多数程序员并不会直接分享源代码,他们更愿意分享库文件的二进制版本——链接库

所谓链接库,其实就是将开源的库文件(例如上面提到的 myMath.c)进行编译、打包操作后得到的二进制文件。虽然链接库是二进制文件,但无法独立运行,必须等待其它程序调用,才会被载入内存

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

  • 编译:由编译器逐个对源文件做词法分析、语法分析、语义分析等操作,最终生成多个目标文件。每个目标文件都是二进制文件,但由于它们会相互调用对方的函数或变量,还可能会调用某些链接库文件中的函数或变量编译器无法跨文件找到它们确切的存储地址,所以这些目标文件无法单独执行
  • 链接对于各个目标文件中缺失的函数和变量的存储地址(后续简称“缺失的地址”),由链接器负责修复,并最终将所有的目标文件和链接库组织成一个可执行文件

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

  • 无论缺失的地址位于其它目标文件还是链接库,链接器都会逐个找到各目标文件中缺失的地址。采用此链接方式生成的可执行文件,可以独立载入内存运行;
  • 链接器先从所有目标文件中找到部分缺失的地址,然后将所有目标文件组织成一个可执行文件。如此生成的可执行文件,仍缺失部分函数和变量的地址,待文件执行时,需连同所有的链接库文件一起载入内存,再由链接器完成剩余的地址修复工作,才能正常执行。

  

标签:文件,int,链接库,笔记,静态,动态链接库,链接
来源: https://www.cnblogs.com/zjuhaohaoxuexi/p/16692625.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有