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 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux_动态库与静态库(制作与安装) -> 正文阅读

[系统运维]Linux_动态库与静态库(制作与安装)

1.静态库和动态库的定义,库的命名规则

动静态库类似与“半个可执行程序”

程序在编译时会经历4步
预处理->编译->汇编->链接分别生成三个临时文件
.i->.s->.o,其中.o可重定向二进制文件。对于C语言,我们把除了含有main函数的.c文件的其他.c文件在汇编所生成的.o文件打包,这个包称为库(.so/.s)
动静态库的本质为一堆.o文件的集合。不包含main但是包含了大量的方法

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

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

库的命名规则:
lib+库名+后缀(.s/.so等)
eg:libc.so.6的库名为c,其表示c语言动态库

2.静态库与动态库的优缺点

Linux Centos下载C静态库命令

sudo yum install glibs-static

生成静态链接C程序 -static

注意:要安装C静态库

在这里插入图片描述

查看可执行程序依赖的动态库(ldd)

在这里插入图片描述

静态库与动态库的特征

①动静态程序运行过程

在这里插入图片描述
静态可执行程序
加载:因为可执行程序包含头文件所有方法和main函数,所以加载到内存比较大。
在内存的程序代码通过页表对应进程地址空间的正文代码段

如果其他进程也需要使用C库,内存中没有加载C库,C库在静态可执行程序中,所以其他进程还要重新加载C库,浪费了内存空间

动态可执行程序
加载:除了代码加载到内存,其所使用的方法也会被加到内存。所以加载比较小
内存中的代码映射到进程地址空间的正文代码段,所使用的方法映射到栈和堆区之间的共享区

如果其他进程也需要使用C库,则只要调整其他进程的映射关系到已经在内存加载好的C库即可,不需要重复加载,节省内存空间

注意:
共享区:1.无法被写入 2.所有使用该库的进程可以共享

②动静态库的优缺点

静态库
缺点:1.加载到内存时所占空间大 2.多个进程使用同一库会导致内存资源浪费

优点:1.与库无关,库已经链接在可执行程序中,删除库后仍可运行

动态库
缺点:1.依赖库,如果可执行程序生成后,删除库则无法运行这个可执行程序

优点:1.节省内存空间资源

3.打包.o文件制作动静态库

打包静态库(ar -rc)

ar -rc +静态库名称+依赖的.o文件

在这里插入图片描述
其中r表示replace c表示create,表示当生成静态库的.o文件发生改变时会更新静态库
将所有的头文件和生成的静态库整理到一个文件中如下图

生成静态可执行程序(gcc -I+头文件路径-L+库路径-l+要链接的库名)

注意:
库名为去掉lib和后缀之后剩下的名字
eg:libc.so.6库名为c

在这里插入图片描述
如果直接运行因为这个库不在系统路径下,所以会找不到头文件和库

在这里插入图片描述
我们要在链接时指定头文件搜索路径和所依赖的库路径,并且还要指定要链接的库名称

在这里插入图片描述

安装自己的静态库(将库拷贝到系统路径下)

在这里插入图片描述
注意:
1.此时在生成可执行程序时不需要指明库路径和头文件路径,但还是要指明库名称。
2.我们在编译c语言的库不需要指明库名称因为编译器自己会自动找到库名称

在这里插入图片描述

4.打包.o文件制作动态库(gcc -fPIC gcc -shared)

注意:
在生成.o文件时要生成位置无关码,在gcc后加 -fPIC表示生成位置无关码

在这里插入图片描述
在将生成的.o文件生成动态库时还要加-shared选项
在这里插入图片描述
在这里插入图片描述

这个mathlib_Dy就是我们生成的动态库

生成动态可执行程序(无法执行)

生成动态可执行程序的思路和静态相同。指明头文件,库路径和库名称

在这里插入图片描述

这里发现gcc生成了可执行程序后并不能运行。
原因为:gcc时将头文件和库路径和库名称指定所以生成了可执行程序,但是在运行的过程中,操作系统无法查找到可执行程序所依赖的库

在这里插入图片描述
如上图:libMy.so为not found

5.解决动态库生成的可执行程序无法运行

①将依赖的库拷贝到系统路径下

这种方法可以让操作系统在运行的时候找到其依赖的库

②更改环境变量(LD_LIBRARY_PATH)

LD_LIBRARY_PATH表示程序在运行时动态查找的路径
环境变量的添加删除与命令获取
export命令
在这里插入图片描述
导出环境变量后,操作系统就可以找到这执行程序所依赖的库
在这里插入图片描述

③更新ldconfig配置

Linux centos中/etc/ld.so.conf.d下保存的是配置文件,这些配置文件中是一些路径
可以将自己库的路径写到配置文件中再拷贝到/etc/ld.so.conf.d文件夹中再ldconfig刷新即可

在这里插入图片描述
可以发现可执行程序中libMy.so可以找到了

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:54:25  更:2021-10-20 12:54:31 
 
开发: 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/15 20:02:46-

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