IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 动态库和静态库 -> 正文阅读

[系统运维]动态库和静态库

静态库和动态库

库的名字都是去掉lib和后缀之后的才是库名。这点很重要

静态库

静态库在linux下是.a文件。程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。

系统角度:
静态库是在链接过程被加入到了进程地址空间的代码区。
图示:
在这里插入图片描述

好处:如果编译链接后,把静态库删掉也可以运行。这个程序具有可移植性。

坏处:让程序变得超级大,原因也很简单,就是因为加入了很多代码。

动态库

动态库在linux下是以.so结尾的文件。程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
动态库的链接是发生在程序运行的时候。共享区通过页表映射到物理内存里的动态库,这样就能直接使用了。

系统角度:
在这里插入图片描述

动态链接

  1. 由于动态库是运行的时候才去链接动态库的代码的,违反了我们之前的一贯认知,是先链接再运行。
    因此我们一贯说的预处理编译汇编链接的链接是指把动态库代码从硬盘加载进内存的这个过程,被称为动态链接(dynamic linking)

  2. 动态库的链接并不是外部整一个动态库的所有代码,而是程序需要什么函数,就链接对应函数。

  3. 动态库可以让多个进程使用

生成库

库的构成是头文件和库文件,其中库文件是.o文件

生成静态库

先给代码:
创建lib库代码:
在这里插入图片描述
执行静态库
在这里插入图片描述
步骤:
1.生成静态库首先要先生成.o文件。因此gcc -o选项即可
2.一堆.o文件不好看,帮他打包一下成一个文件。静态库打包用工具ar,选项是-rc(replace and create)
3.创建一个目录lib,里面放头文件和库文件。类似这样:
在这里插入图片描述
4.这个库就可以被链接使用了。程序要用这个静态库的时候,由于系统找不到这个库在哪,因此有以下几种方法帮助系统找到这个静态库。

第一种:选项

  1. 选项-I + 路径 ------- 用于找到头文件
  2. 选项-L + 路径 ------ 用于找到放.a文件的目录
  3. 选项-l + 文件名 ------ 用于找到需要的.a文件

第二种:加入系统指定的目录

/usr/lib
/usr/local/lib

生成动态库

先给代码
在这里插入图片描述
执行动态库代码:
先导入环境变量LD_LIBRARY_PATH = 动态库.so的路径
在这里插入图片描述
然后再执行。

否则就会报错:
在这里插入图片描述

为什么会这样呢?

这和动态库链接是在运行的时候链接有关系。
程序运行的时候,编译器gcc已经知道了这个库在哪里了,但是系统不知道。

问题来了:为什么系统要知道这个库在哪里?
原因是动态链接只是将动态库从硬盘加载进内存里面,然而系统还要帮助进程,让进程地址空间中的共享区通过页表映射到拥有动态库的内存。

因此导入环境变量的作用就是让系统找到动态库的位置,然后改变页表的映射关系,让程序找到动态库的位置。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 16:03:51  更:2022-02-28 16:08:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:17:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码