【Linux】动静态库的使用与软链接的结合

这篇具有很好参考价值的文章主要介绍了【Linux】动静态库的使用与软链接的结合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

库本质就是把一堆(.o)后缀的文件也就是目标文件整合在一起
【Linux】动静态库的使用与软链接的结合,linux,restful,运维

一、静态库

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

1.静态库的创建

[root@localhost linux]# gcc -c mymath.c -o mymath.o
先把文件变成目标文件
生成静态库
[root@localhost linux]# ar -rc libmymath.a   mymath.o 
ar是gnu归档工具,rc表示(replace and create)

格式:
ar -rc 静态库名字(注意格式)  静态库所包含的目标文件

2.静态库的链接

【Linux】动静态库的使用与软链接的结合,linux,restful,运维

3.将库进行打包

在makefile中
【Linux】动静态库的使用与软链接的结合,linux,restful,运维
【Linux】动静态库的使用与软链接的结合,linux,restful,运维

1.第三方库的使用,gcc往后必须加上 -l +库名
2.如果系统中只提供静态链接,则gcc对其进行静态链接
3.如果系统中链接多个库,则直接在gcc后面加上指定路径和库的名字就可以

4.链接方法:

1.直接链接

【Linux】动静态库的使用与软链接的结合,linux,restful,运维

2.拷贝到系统路径里面

【Linux】动静态库的使用与软链接的结合,linux,restful,运维

一般系统里头文件都在/usr/include
库都在/lib64

将我们的库放到系统路径下,我们就不需要在编译的时候指定我们的路径了,因为系统会自己到系统路径中找,但我们还是要带上我们的库名的,这是规定

3.采用软链接方法

先为头文件部分以及库文件创建软链接放入系统路径中去
【Linux】动静态库的使用与软链接的结合,linux,restful,运维
【Linux】动静态库的使用与软链接的结合,linux,restful,运维
编译链接
【Linux】动静态库的使用与软链接的结合,linux,restful,运维

二、动态库

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

//生成目标文件,需要带-fPIC
[root@localhost linux]# gcc -fPIC -c myprint.c mylog.c 
//创建动态库
[root@localhost linux]# gcc -shared -o libmymath.so  *.o  

【Linux】动静态库的使用与软链接的结合,linux,restful,运维

【Linux】动静态库的使用与软链接的结合,linux,restful,运维
【Linux】动静态库的使用与软链接的结合,linux,restful,运维

我们前面只告诉了编译器我的动态库在什么位置,但当我程序运行起来的时候就和编译器没关系了,所以我们也要告诉系统(加载器)我的动态库放在哪里!!!
静态链接能找到是因为我们静态库直接整个干到可执行文件里面了,根本不需要去找静态库,因为已经和我原来的可执行程序融为一体了

1.解决加载找不到动态库的方法

1.直接拷贝

和静态库类似,直接拷贝到系统默认库路径 /lib64

2.建立软链接

【Linux】动静态库的使用与软链接的结合,linux,restful,运维
【Linux】动静态库的使用与软链接的结合,linux,restful,运维

3.建立自己的动态路径配置文件

ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

不认动态库名,只需放入动态库路径,因为当时我们告诉过编译器我们用哪个库了
【Linux】动静态库的使用与软链接的结合,linux,restful,运维
将动态库路径写入创建的conf文件
【Linux】动静态库的使用与软链接的结合,linux,restful,运维
【Linux】动静态库的使用与软链接的结合,linux,restful,运维
重新ldconfig后,我们就能找到动态库的路径,而且是全局有效
【Linux】动静态库的使用与软链接的结合,linux,restful,运维

2.为什么动态库权限需可执行而静态库没有

因为我们静态库直接拷贝到源文件中,拷贝完成后,后续程序运行的时候就用不到了,因为我内部已经有了,而我动态库要以可执行程序的形式加载到内存中与可执行程序产生关联,静态库不需要加载到内存

三、关于地址

动态库在内存中加载会被所有程序共享,动态库在运行的时候是要被加载到内存中的

1.exe加入到物理内存后与页表建立映射关系,当需要使用动态库的时候,动态库也会用类似的方法加入到内存中,之后2.exe也要使用和1.exe相同的动态库,操作系统知道库的加载情况,检测到那个库已经加载到内存里面不需要再加载一遍了,所以直接改变进程2的页表,让动态库与其共享区建立联系

【Linux】动静态库的使用与软链接的结合,linux,restful,运维

1.程序没有加载前的地址(程序)

编译器也要为操作系统考虑,程序编译后之后,内部就已经有地址了,这里的地址现在来看其实就是虚拟地址

【Linux】动静态库的使用与软链接的结合,linux,restful,运维

2.程序加载后的地址(进程)

问:如何执行我们的第一条命令呢?

答:
其实我们在编译好文件的时候,文件中会有一个entry即入口地址存在于表头,我们CPU中的PC会载入程序的入口地址,这个入口地址是虚拟地址,所以我们要借助页表去寻找其物理地址,但因为此时我们入口地址对应的物理地址还未写入页表,这个时候就会发生缺页中断,该程序会加载到物理内存中,物理地址与虚拟地址的映射关系也会被写入页表中,这样就完成了一个循环过程,我执行下面的指令如果没有对应的物理地址会发生缺页中断写入页表

重点:
⭕与此同时,操作系统会为程序对应的进程构建进程地址空间,并让进程中的指针指向其对应的进程地址空间。
当CPU要运行这段进程时,操作系统会把地址空间代码区的code_start送入CPU,CPU进入代码区后从main函数作为入口开始执行程序
🚩而因为编译器在编译程序代码内部的逻辑地址时,同样也是遵循进程地址空间的规则来编址的,所以当为进程构建地址空间时,其地址空间中的各个虚拟地址是直接使用编译器在编译可执行程序时生成的逻辑地址。
所以当CPU要开始执行程序时,是拿到了main函数的虚拟地址,再通过页表映射到物理内存中的物理地址,找到main函数加载到内存中的代码数据并运行,而在main函数运行的过程中进行了fun函数的调用,这时CPU读取到的依旧是fun函数的虚拟地址(可执行程序中的逻辑地址),然后再次通过页表映射到物理内存中的物理地址

CPU在运行时,读取的都是指令,指令中便包含了地址,而自始至终,CPU读取的都是虚拟地址,没有见过物理地址

【Linux】动静态库的使用与软链接的结合,linux,restful,运维

3.动态库使用

问:我们可执行程序,如何找到动态库中我们要使用的特定部分呢?
*
答:页表中会存储动态库的起始位置的虚拟地址与物理地址的链接,动态库直接采用偏移量对库中函数进行编址,我们知道printf的偏移量后再知道动态库的起始地址,就能再动态库中找到printf

【Linux】动静态库的使用与软链接的结合,linux,restful,运维文章来源地址https://www.toymoban.com/news/detail-755194.html

到了这里,关于【Linux】动静态库的使用与软链接的结合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【linux】动静态库的使用与制作

    本章节是基础IO的的最后一个话题!! 我们有没有用过库? 答案是一定的,我们在使用printf,stl容器…等等函数都是在使用库, 不然的话我们在使用这些东西时,明明你自己没有实现,程序缺依然能执行呢? 都是因为库的存在! 既然知道了库的存在,那我们肯定要见一见。

    2024年04月27日
    浏览(28)
  • 【Linux】动静态库的制作与使用

    静态库的名称格式为: libxxx.a   注意 xxx 才是静态库的真正名字 。 动态库的名称格式为: libxxx.so   注意 xxx 才是动态库的真正名字 。 注意动态库中生成 .o 文件时gcc 要带选项 -fPIC ,表示生成位置无关码 。 注意: 不论是静态库还是动态库,都不可以有 main 函数 。 我们先

    2024年02月04日
    浏览(27)
  • Linux 动静态库的制作,使用和加载

    关于动静态库的初步理解,我们在Linux基础环境开发工具的使用(二):动静态库的理解,make,makefile 这篇博客中进行了详细介绍,大家可以去看一下 今天我们直接介绍动静态库的制作和使用,分别站在库的制作者和使用者的角度来分析 而我们要使用的文件就是我们在 Linux文件系列: 深

    2024年04月15日
    浏览(29)
  • Linux中静态库和动态库的使用

    介绍: 库是一个二进制文件,包含的代码可被程序调用 标准C库、数学库、线程库… 库有源码,可下载后编译;也可以直接安装二进制包 位置一般放在:/lib /usr/lib 库的知识 库是事先编译好的,可以复用的代码 在os上运行的程序基本上都要使用库,使用库可以提高开发效率

    2024年01月25日
    浏览(29)
  • 【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux

    2024年01月15日
    浏览(25)
  • 详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别

    关于gcc的使用方法可以参考下方链接博客: Linux下详解gcc编译过程(含代码示例) gcc使用教程 库是一种组件技术。 库里封装了数据和函数,提供给用户程序调用。 库只执行到第三阶段编译,没有链接。 库的使用可以使程序模块化,提高程序的编译速度,实现代码复用。

    2024年02月15日
    浏览(31)
  • 【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤

    1、提高开发效率,让开发者所有的函数实现不用从零开始。 2、隐藏源代码。          库其实就是所有的.o文件用特定的方式进行打包形成一个文件,各个.o文件包含了源代码中的机器语言指令。 先将我们的.c文件或者是.cpp文件形成.o文件,指令为: gcc/g++ -c 要形成的.o文

    2024年04月17日
    浏览(34)
  • Windows下C++静态链接库的生成以及使用

    这篇文章简单讨论一下Windows下如何使用VS生成和使用C++静态链接库,示例使用VS2022环境。 先创建C++项目-静态库 然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保留。 然后创建需要的.h和.cpp文件。 看下代码 很简单的代码,就是提供一个打印字符串的接口。编译一

    2024年02月05日
    浏览(28)
  • 【Linux】Linux编译器 gcc/g++的使用&&初识动静态链接库

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】Linux环境基础工具的基本使用及配置(yum、vim) 在上一篇 Linux 博客中,我们讲解了 vim 编辑器的使用,可以在 Linux 上写

    2024年02月11日
    浏览(38)
  • Linux系统vim,gcc,g++工具使用及环境配置,动静态库的概念及使用

    所属专栏:Linux学习❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ 如果你的Linux下还没有安装vim,则执行下面指令: sudo yum install -y vim

    2024年02月04日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包