1.Linux库详解

news2024/11/20 4:18:51

Hello,小伙伴们,大家好!最近有小伙伴问我程序库相关的问题。程序库的存在很大程度上提高了程序的复用性、可维护性,但是程序库的应用往往对于初学者来说有些摸不清头脑,所以这一期本文从Linux的角度谈谈Linux下的程序库。

关注公人从号Linux兵工厂,领取海量Linux学习资料,更有好多干货文章供学习

1. 什么是库

库文件一般就是编译好的二进制文件,用于在链接阶段同目标代码一起生成可执行文件,或者运行可执行文件的时候被加载,以便调用库文件中的某段代码。库文件无法直接执行,因为它的源代码中没有入口主函数,而只是一些函数模块的定义和实现,所以无法直接执行。程序库使程序更加模块化,重新编译更快,更新更容易

  • 说起库,对于软件开发人员来说都不陌生,而且应该是必须掌握的一项技术。在windows平台和linux平台下都大量存在着很多库。因此库文件是为了方便升级、维护或二次开发,而发布的一组可以单独与应用程序在编译时或运行时链接的二进制可重定位目标码文件。
  • 实际开发中我们所编写的程序需要依赖很多基础的底层库,因此库的存在有很大的意义,避免每次编码都要从头开始
  • 本质上库是可执行代码的二进制形式,这个文件可以在编译时由编译器直接链接到可执行程序中,也可以在运行时根据需要动态加载到内存中
  • Windows和Linux系统的本质不同,所以这两个系统库的格式不同,同样也是不兼容的,本文不讲Windows下的库,我们只关注Linux下的程序库
  • 例如我们常用的标准C/C++库、Qt库、GTK库等

2. 库的种类

为了便于理解,将程序库可以分为三种类型:静态库、共享库和动态加载(DL)库

2.1 静态库

Linux下静态库以.a结尾的库文件

  • 静态库实际上是一些目标文件的集合,在生成可执行文件阶段进行链接。Linux下编译源码时源文件经过编译生成.o的目标文件,.o的目标文件在链接阶段经过链接生成可执行程序。所以在链接阶段可以链接.o的目标文件,也可以把所有.o的目标文件进行打包,统一进行链接,因此打包.o文件生成的文件,就是静态库
  • 静态库只在程序链接阶段被链接使用,链接器会将程序中使用到代码段和数据段从库文件中拷贝进来。当链接完成并生成可执行程序后,在程序执行阶段就不需要静态库了。因为使用静态库的应用程序需要拷贝所用到的代码段、数据段等,所以链接静态库生成的可执行程序会增大。当多个程序连接相同的静态库时,运行时所占用内存空间较大,但是由于程序运行的时候不再动态加载静态库,所以速度相比于共享库会快一些。

2.2 共享库

Linux下共享库以.so结尾的库文件

  • 共享库在程序链接的时候不会像静态库那样从库中拷贝使用的代码段和数据段到生成的可执行程序中,而只是做相应的标记,在程序开始执行时,动态地加载所需的库。因此,可执行程序在运行的时候需要共享库的支持。调用共享库的可执行程序比静态库链接出来的可执行程序要小,当多个程序调用共享库时,运行时所占用内存空间比静态库的方式要小。

共享库命名

在Linux系统中我们经常看到同一个共享库还有软连接文件指向共享库。一般来说一个共享库有三个名字:soname、real-name、linker-name

  • soname是一个软连接,用来区分版本的名字,如果real-name文件存在的话,它是指向real-name的软链接文件,名称的形式一般是lib*.so.X.Y(其中X,Y就是代表版本号),每当接口改变时它都会递增。在工作系统上,完全限定的 soname 只是指向共享库“真实姓名”的符号链接
  • real-name每个共享库还有一个“真实名称”,即包含实际库代码的文件名。真实姓名在soname上加上一个小数点、一个小号、另一个小数点和发布号。最后期间和版本号是可选的。次要编号和版本号通过让你确切知道安装了哪些版本的库来支持配置控制。请注意,这些数字可能与文档中用于描述库的数字不同
  • linker-name是传递给连接器的名字,应用程序调用时用于链接的搜索,一般它可能就是指向soname的连接,名称的形式一般是lib*.so。换句话说,它只是没有任何版本号的soname

Linux系统上这样做的目的主要是系统中允许不同版本的库文件共存,一般在命名库文件的时候通常与soname相同

在这里插入图片描述

如何装载共享库

  • ldconfig命令,在Linux中,运行一个可执行程序时,程序装载器会被自动装载并运行。这个程序装载器就是/lib/ld-linux.so.X(X是版本号)。该加载程序依次查找并加载该程序使用的所有其他共享库。被搜索的目录保存在/etc/ls.so.conf文件中,但如果某个所使用的库的路径不在搜索之内,手动添加上。为了避免程序每次启动都搜索一边,Linux系统对共享库采用了缓存管理之ldconfig工具,其默认读取/etc/ld.so.conf文件,对所有共享库按照一定规范建立符号连接,然后将信息写入/etc/ld.so.cache。每次搜索的时候实际是通过ld.so.cache这个缓存文件进行搜索,/etc/ld.so.cache的存在大大加快了程序的启动速度。每次修改ld.so.conf文件之后,运行ldconfig命令便把信息更新到缓存文件中。

  • 环境变量,可以通过设置环境变量LD_LIBRARY_PATH来设置ld的装载路径。这样装载器就会首先搜索该变量的目录,然后搜索默认目录。

  • 传参数,如果您不想设置LD_LIBRARY_PATH环境变量,在 Linux 上可以直接调用程序加载器并向其传递参数。
    例如,以下将使用给定的PATH而不是环境变量LD_LIBRARY_PATH的内容,并运行给定的可执行文件:

/lib/ld-linux.so.2 --library-path 可执行路径
  • 在Linux系统上或嵌入式Linux系统上装载库一般通过下面三种方式:
    1.拷贝库到默认的库搜索路径/usr/lib中
    2.设置环境变量LD_LIBRARY_PATH,在其中添加库的路径
    3.修改配置文件/etc/ld.so.conf加入库所在的路径,并刷新缓存ldconfig
    4.木荣君常用1、2两种方法

2.3 动态加载库

动态加载库(dynamically loaded (DL) libraries)是指在程序运行过程中加载的函数库。而不是像共享库一样在程序启动的时候加载。
在Linux中,动态库的文件格式跟共享库没有区别,主要区别在于共享库是程序启动时加载,而动态加载库是运行的过程中加载。可以理解为动态加载库是共享库的另一种调用方式。
DL对于实现程序模块化很有用处,因为它可以让程序在运行时进行模块升级。

动态加载库如何实现

在Linux系统中,实现动态加载库的调用,有一个用于打开库、查找符号、处理错误和关闭库的API。C程序需要包含头文件<dlfcn.h>才能使用这些API,具体相关的API使用我们放在下一节详解

3. 三种库对比

特点
静态库静态链接库在程序编译时会被链接到目标代码中,目标程序运行时将不再需要库,移植方便,但是体积较大,因为所有相关的库内容都被链接合成一个可执行文件,这样导致可执行文件的体积较大
共享库动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入,因为可执行文件体积较小。有了动态库,程序的升级会相对比较简单,只需要替换动态库的文件,而不需要替换可执行文件
动态加载库动态库的文件格式跟共享库没有区别,主要区别在于共享库是程序启动时加载,而动态加载库是运行的过程中加载。可以理解为动态加载库是共享库的另一种调用方式

4. Linux下库文件制作

本节只针对Linux下库的概念及分类做详细阐述,下一节将详细讲解如何通过程序创建属于我们自己的库文件,包括创建静态库、共享库、动态加载库的实现等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (二)异步复位的串联T触发器

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 &#xff08;二&#xff09;异步复位的串联T触发器 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN博客 &#x1f9e8;未经作者允许&#xff0c;禁止转载 &#x1f511;系列专栏&#xff1a…

算法之拓扑关系

目录 前言&#xff1a; 算法解析 Kahn算法 DFS算法 总结&#xff1a; 参考资料 前言&#xff1a; 如何确定代码源文件的编译依赖关系&#xff1f; 我们知道&#xff0c;一个完整的项目往往会包含很多代码源文件。编译器在编译整个项目的时候&#xff0c;需要按照依赖关…

4-大规模城市场景建模与理解

方向&#xff1a;三维重建 题目&#xff1a;大规模城市场景建模与理解 作者&#xff1a;陈宝权 万国伟 山东大学 关键词&#xff1a;场景重建 场景理解 自动扫描 智能建模 来自&#xff1a;中国计算机学报通讯 12卷 8期 2016.08 期刊&#xff1a;https://github.com/Darr…

在智能家居音箱领域上的音频功放芯片IC

目前&#xff0c;音频功放芯片主要应用于手机、音响、车载、可穿戴设备、计算机设备、智能家居等领域。随着人机交互逐步落地&#xff0c;从应用广度上对音频功放芯片需求完全放开&#xff0c;截止2021年以“智能音箱”、“智能家居”为代表的音频智能终端也持续放量&#xff1…

Java开发学习(四十)----MyBatisPlus入门案例与简介

一、入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提供效率。 SpringBoot它能快速构建Spring开发环境用以整合其他技术&#xff0c;使用起来是非常简单&#xff0c;对于MybatisPlus&#xff0c;我们也基于SpringBoot来构建…

掌握流量密码五要素,抓住底层逻辑,让你更容易获得流量

分享一篇关于流量的文章&#xff1a;流量是一切赚钱项目中最重要的一个要素没有流量&#xff0c;赚钱就是空谈。流量多就赚的多&#xff0c;流量少就赚的少&#xff0c;没有流量就没得赚。因为流量非常重要&#xff0c;所以要打造私域用户池&#xff0c;让流量变成留量。私域用…

微信小游戏开发学习记录2

接上一篇&#xff1a;微信小游戏开发学习记录_寂静流年韶华舞的博客-CSDN博客_微信小游戏开发学习 目录 一、UI系统 1、基础渲染组件-精灵组件 &#xff08;1&#xff09;操作&#xff1a; &#xff08;2&#xff09;Sprite 属性 &#xff08;3&#xff09;渲染模式 2、L…

Qt基于CTK Plugin Framework搭建插件框架--事件监听

文章目录一、前言二、框架事件三、插件事件四、服务事件五、添加事件监听一、前言 CTK一共有三种事件可以监听&#xff1a; 框架事件插件事件服务事件 但是这些事件只有在变化时才能监听到&#xff0c;如果已经变化过后&#xff0c;进入一个稳定的状态&#xff0c;这时才去监…

Android Studio实现一个新闻APP系统源码,仿网易,搜狐等新闻客户端,本科毕业设计必备项目

DavidTGNewsProject ##【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端 完整代码下载地址&#xff1a;Android Studio实现一个新闻APP系统源码 先给大家看一下效果图&#xff1a; 这个项目总体来说虽然不是特别难&#xff0c;但是确实非常常用的功能。是业余时间…

wordcloud | 词云 in python

wordcloud | 词云&#x1f928;wordcloud | 词云&#x1fae1;词云是啥&#x1f636;‍&#x1f32b;️词云的历史&#x1f914;安装 wordcloud 包&#x1f60e;官方文档&#x1f923;一个最简单的例子&#x1f44d;运行结果&#x1f60a;感谢&#x1f928;wordcloud | 词云 赢…

Vue中v-for不要和v-if一起使用

在Vue2中v-for和v-if一起使用时会报错&#xff1a;The xxx variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should not mix v-for with v-if原因&#xff1a;Vue2中当 v-if 与 v-for 一起使用时&…

4张图搞懂Salesforce的认证体系(附新手考证攻略)

Salesforce认证计划概述最近这一两年&#xff0c;Salesforce的Trailhead和认证太热门了&#xff0c;小伙伴们前赴后继地刷Badge拿认证&#xff0c;可以考的认证也随着产品家族的增加而增加&#xff0c;从十几年前的几个认证&#xff0c;增长到现在的40多个认证。与其他应用平台…

2023年自学网络安全珍藏版路线,高效入门

前言 【一一帮助安全学习一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 ④50份安全攻防面试指南 ⑤安全红队渗透工具包 ⑥网络安全必备书籍 ⑦100个漏洞实战案例 ⑧安全大厂内部视频资源 ⑨历年CTF夺旗赛题解析 01 什么是网络安全 网络安全可以基于攻击…

Seq2Seq增加attention机制的原理说明

以中文翻译为英文为例讲解seq2seq的原理&#xff0c;以及增加attention机制之后的seq2seq优化版本。 文本参考: Pytorch实现Seq2Seq&#xff08;Attention&#xff09;字符级机器翻译_pytorch seq2seq_孤独腹地的博客-CSDN博客 https://github.com/datawhalechina/learn-nlp…

Dbeaver连接ES问题一站解决

前言 最近几天一直做ES的TPS测试&#xff0c;每次看数据ES的数据都在嫌麻烦&#xff08;在postman指定索引通过url请求查看数据&#xff09;。最后决定还是整整Dbeaver连接ES。 一、当前境况 1、ES版本比较老&#xff0c;还是6.4.2的 2、Dbeaver直接连接已经提示支持8.x版本 3…

【自学Python】Python格式化输出

Python格式化输出 Python格式化输出教程 在 Python 中&#xff0c;print() 函数用于打印相应的信息到终端控制台&#xff0c;同时我们还可以通过 print() 函数的 % 占位符&#xff0c;来对输出进行格式化&#xff0c;即按照我们指定的格式进行输出。 Python格式化输出占位符…

灵能传输(思维 贪心)

题目如下&#xff1a; 思路 or 题解 如果我们可以发现前缀和&#xff0c;对于这个题有特殊的性质&#xff0c;这个题就不能做出来了&#xff0c;不然你会想我一样卡好长时间&#xff0c;从不知所措。 ai1ai,ai−1ai,ai−2aia_{i1}a_i,a_{i−1}a_i,a_i−2a_iai1​ai​,ai−1​a…

html 获取视频文件的宽高尺寸,怎么获取视频的宽度-解决方案

html代码 <video id"video" loop preload"auto" autoplay><source src"1.mp4" type"video/mp4">您的浏览器不支持Video标签。 </video> js代码 var videodocument.querySelector("#video");//当前视频…

Unity 之 资源加载 -- 可寻址系统使用介绍 -- 入门(三)

可寻址系统设置面板使用介绍介绍 -- 入门&#xff08;三&#xff09;一&#xff0c;可寻址系统目录介绍二&#xff0c;可寻址系统面板介绍2.1 Groups - 资源组2.2 Settings - 设置2.3 Profiles - 配置文件2.4 Event Viewer - 事件查看器2.5 Analyze - 分析工具2.6 Hosting - 托…

springAOP的注解使用

注解使用导入依赖常用注解&#xff1a;注意&#xff0c;给测试类起名字的时候千万不要定义成Test&#xff0c;测试的方法不可以有参数&#xff0c;不可以有返回值在使用注解的时候&#xff0c;还需要告诉spring应该从哪个包开始扫描,一般在定义的时候都写上相同包的路径需要导入…