【Linux】动态库和静态库

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

软链接

命令:ln -s 源文件名 目标文件名
软链接是独立连接文件的,他有自己的inode number,有自己的inode属性和内容。
软链接内部存放的是自己所指向文件的路径。
现实中,我们软链接的应用有,例如电脑桌面的快捷模式等。
【Linux】动态库和静态库,Linux,linux,java,运维
inode number 不相同

硬链接

命令:ln 源文件目标文件
硬链接,通过inode来重新链接一份文件,此文件的inode跟原文件的inode是一样的,可以理解为原文件的浅拷贝,两个文件内容是共享的,不管增加还是删除,这是因为他们的inode是相同的
【Linux】动态库和静态库,Linux,linux,java,运维
inode相等
【Linux】动态库和静态库,Linux,linux,java,运维

硬链接要注意

硬链接是不可以给目录做硬链接的,这是因为当用户进行对目录硬链接时,容易造成环路问题,os无法识别那个是自己定义的硬链接。

了解目录隐藏文件. ..
【Linux】动态库和静态库,Linux,linux,java,运维

自定义实现一个静态库(.a)

  1. 系统已经预装了c/c++的头文件和库文件,头文件提供方法说明,库提供方法的实现,头和库是有对应关系的,是要组合在一起使用的。
  2. 头文件是在预处理阶段就引入的,链接本质就是链接库

方法一:头文件和.o文件在一块可直接应用
【Linux】动态库和静态库,Linux,linux,java,运维

形成静态库文件
命令:ar -rc lib库名.a *.o
【Linux】动态库和静态库,Linux,linux,java,运维

方法二:我们将库和头文件都带入到另一个文件进行重新编译运行
【Linux】动态库和静态库,Linux,linux,java,运维
当我们使用时发现不可以正常使用
【Linux】动态库和静态库,Linux,linux,java,运维
这是因为我们引入了第三方的库,编译器目前不认可这个库,需要我们手动

解决、使用方法

第三方库的使用错误解决方法:

  1. 需要指定所用的头文件和库文件
  2. 如果没有安装到对应的编译器路径下,用户必须指明对应的选项,告知编译器,头文件在哪里,库文件在哪里,库文件具体是谁。
  3. 将三方库拷贝到编译器路径下时,我们进行编译时,也需要使用-l指定具体使用的库

l:只要库名即可(去掉lib以及版本号)
L:链接库所在的路径
I:链接库的头文件所在路劲
【Linux】动态库和静态库,Linux,linux,java,运维

方法三:头文件放到include目录下,库文件放到lib目录下,将两个目录打包交给别人
【Linux】动态库和静态库,Linux,linux,java,运维

静态库的内部加载过程

静态库不需要加载,静态库是将代码直接拷贝到程序中,因此内存中的代码和数据可能会存在多分,造成空间浪费。把静态库代码拷贝到内存中的代码区。
当我们将静态库加载过一次之后,在删除静态库后还是可以正常跑的 【Linux】动态库和静态库,Linux,linux,java,运维

自定义实现一个动态库(.so)

形成动态库文件

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码
    动态库采用的是相对位置编址。只保存相对函数之间的偏量值(库起始地址+函数之间偏移量)
    而静态库采用的为绝对地址,如果我们库位置有所变动,他就需要重新拷贝
    【Linux】动态库和静态库,Linux,linux,java,运维

【Linux】动态库和静态库,Linux,linux,java,运维

与静态库使用发放三方式相同,但是需要注意的方面不一样

头文件放到include目录下,库文件放到lib目录下,将两个目录打包交给别人
【Linux】动态库和静态库,Linux,linux,java,运维
【Linux】动态库和静态库,Linux,linux,java,运维

为什么静态库就可以找到而动态库就不可以呢?
这是因为静态库的链接原则是将用户使用的二进制代码直接拷贝到目标可执行程序中但是动态库不会。

如何解决os找不到动态库问题?

  1. 配置环境变LD_LIBRARY_PATH(临时方案,当系统重启后需要重新配置)
    【Linux】动态库和静态库,Linux,linux,java,运维
    【Linux】动态库和静态库,Linux,linux,java,运维
  1. 软连接方案
    【Linux】动态库和静态库,Linux,linux,java,运维
    去掉软连接方法
    sudo unlink /lib64/libmy_math.so
  1. 配置文件方法
    ls /etc/ld.so.conf.d查看本地的路径配置文件
    sudo touch /etc/ld.so.conf.d/myPath.conf添加创建本地路径配置文件
    【Linux】动态库和静态库,Linux,linux,java,运维
    【Linux】动态库和静态库,Linux,linux,java,运维
    【Linux】动态库和静态库,Linux,linux,java,运维
    系统重新启动也是可以直接使用的,因为我们已经把环境配置好了
动态库加载过程

动态库通过fPIC形成位置无关码,采用相对编址的方式,在程序链接时将对应库中的偏移量添加到程序中,库函数在程序运行时加载进来,经过页表,把库映射到虚拟地址空间后(共享区),库就具有了起始地址。通过起始地址和偏移地址,就可以找到要调用的库函数。
【Linux】动态库和静态库,Linux,linux,java,运维
系统层面上会维护动态库的起始地址(虽然刚刚加载时不能确定起始地址,因为共享区是由OS分配的,但是加载完毕就不会改变了),直接建立页表与内存的映射,就可以直接跳转访问了。所以动态库加载一次就可以被多个进程共同使用。
动态库相对于静态库更节省内存,静态库由多个程序使用相同的库函数,加载到内存中就会导致内存中有多份重复的库函数代码,而动态库则是多个程序共用一份动态库,不会导致出现重复的库函数代码,就节省了内存空间。

静态库和动态库的特点

静态库的特点:文章来源地址https://www.toymoban.com/news/detail-672314.html

  • 静态库在可执行程序链接时就加入到可执行代码中,在物理上成为可执行程序的一部分;程序运行时将不在需要该静态库。
  • 相对于动态库链接生成的程序,静态还相当于编译器将代码补充完整了,因此执行程序会大一些,但是运行起来相对快一些。
  • 静态库是牺牲了空间效率,换取了时间效率
    动态库特点:
  • 动态库在程序编译时并不会被链接到目标程序中,而是在程序运行时才被载入,因此在程序运行时还需要动态库的存在。
    动态库只要在程序执行时,那些需要的函数代码才被拷贝到内存中。这样就使可执行文件比教小,节省磁盘空间。
  • 由于运行时要去链接库会花费一定的时间,执行速度可能会相对慢一些。
    动态库是牺牲了时间效率,换取了空间效率。

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

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

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

相关文章

  • 如何在linux下制作静态库和动态库

    静态库顾名思义是静态的,即程序编译链接时,会把静态库的代码链接到可执行文件中。运行时不需要静态库(将静态库删了也能运行)。 相当于静态库的代码复制到了可执行文件中。 分别有如下add.c add.h sub.c sub.h四个文件格式。 首先把.c文件都编译成.o文件。使用下面命令

    2024年01月24日
    浏览(44)
  • linux并发服务器 —— 动态库和静态库实战(一)

    -E 预处理指定源文件 -S 编译指定源文件 -c 汇编指定源文件 -o 生成可执行文件 -I directory 指定Include包含文件的搜索目录 -g 编译的时候生成调试信息 -D 在程序编译时指定一个宏 -w 不生成任何的警告信息 -Wall 生成所有警告 -On n:0~3;表示编译器的优化选项级别 O0 - 不优化;O1 -

    2024年02月11日
    浏览(49)
  • Linux操作命令&静态库和动态库区别&大小端&孤儿僵尸进程

    cd:切换当前目录 ls:查看当前文件与目录 grep:通常与管道符命令一起使用,用于对一些命令的输出进行筛选和加工 cp:复制文件或文件夹 mv:移动文件或文件夹 rm:删除文件或文件夹 ps:查看进程情况 kill:向进程发送信号 tar:对文件进行打包 cat:查看文件内容 top:查看

    2024年02月16日
    浏览(41)
  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

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

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

    2024年02月15日
    浏览(42)
  • 【探索Linux】—— 强大的命令行工具 P.13(文件系统 | 软硬链接 | 动态库和静态库)

    在计算机科学领域中,Linux 系统一直以来都是备受推崇的操作系统之一。其中,文件系统、软硬链接、动态库和静态库是 Linux 系统中非常重要的概念,在实际应用中扮演着不可或缺的角色。 在上一篇文章中,我们了解了 Linux 系统中文件描述符、重定向以及基础 IO 操作的相关

    2024年02月04日
    浏览(51)
  • 【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识

    这篇文章我们继续学习Linux中的开发工具,今天要学的是: Linux下的编译器——gcc/g++ 我们先来简单了解一下它们的概念: gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。 gcc: gcc 是 GNU 编译器集合中的 C 语言编译器。

    2024年02月16日
    浏览(41)
  • 【Linux】静态库和共享库一分钟快速上手

    程序库,对于程序原来说是非常重要的。但不少人对其不太了解,接下来一起学习其中的奥秘吧! 简单来说,程序库可以分为静态库和共享库。它们包含了数据和执行代码的文件。其不能单独执行,可以作为其他执行程序的一部分来完成某些功能。库的存在,可以使得程序模

    2024年02月08日
    浏览(36)
  • 动态库和静态库

    1. 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 2. 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 3. 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个

    2024年02月09日
    浏览(30)
  • 制作静态库和动态库

    目录 制作静态库 ar命令 使用makefile制作静态库 如何发布自己的静态库给别人呢? 如何使用静态库呢? 方法一 方法二 制作动态库 使用动态库遇到的问题 上面的问题如何解决呢?(如何使用动态库) 1.方法一 2.方法二 3.方法三 4.方法四 搜索优先级 Linux默认头文件的搜索顺序

    2024年02月03日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包