Linux动态链接库.so文件

news2024/9/29 3:32:59

一、动态库和静态库的区别


库是一个二进制文件,包含的代码可以被程序调用,如标准库、线程库。Windows 和 Linux下的库文件格式不兼容。

Windows环境:静态库是 .lib 文件,共享库是 .dll 文件
Linux环境:静态库是 .a 文件,共享库是 .so 文件(一般放在 /lib 或者 /usr/lib 目录下)

1、静态库(静态链接)
之所以称为静态库,是因为在链接阶段,把要用到的第三方库的代码加入到目标可执行文件中,这样的话,该可执行文件在运行时就无需去找库文件了。

可执行文件链接静态库的方式,称为静态链接。正是因为如此,这个时候的可执行文件会比较大。

静态库命令规则:以 lib 作为前缀,以 .a作为后缀。如 libxxx.a

优点:程序中已经包含了代码,运行时不需要再加载静态库,运行速度更快

缺点:占用更多的磁盘空间,静态库升级以后,程序需要重新编译链接。

2、动态库(动态链接)
在编译链接时不会把要用到的库文件代码加入到可执行文件中,而是在链接阶段需要用到的时候,去找到对应的库,然后再调用库里的函数。和静态库不同,动态库中保存的是偏移位置,在要用的时候,根据偏移量找到对应的文件。

可执行文件链接动态库的方式,称为动态链接。避免了空间浪费,需要更新库的时候,无需更新执行文件。

动态库:以 lib 作为前缀,以 .so作为后缀。如 libxxx.so

  • 程序不会包含库中代码,尺寸小
  • 多个程序可共享一个库
  • 库升级方便。无需重新编译程序

Linux中的.so文件 是动态链接的产物 
共享库理解为提供各种功能函数的集合,对外提供标准的接口
Linux中命名系统中共享库的规则

主版本号:不同的版本号之间不兼容
次版本号:增量升级 向后兼容
发行版本号:对应次版本的错误修正和性能提升,不影响兼容性

  • 在Linux中动态库以lib作为前缀, 以.so作为后缀, 中间是库的名字自己指定即可, 即: libxxx.so
  • 在Windows中动态库一般以lib作为前缀, 以dll作为后缀, 中间是库的名字需要自己指定, 即: libxxx.dll                                                                                                                                                          1) 每个动态库有一个包含了真正的库代码的文件名,通常被称为库的 realname ,命名格式通常为
  • libxxx.so.x.y.z,其中so后缀中的x为主版本号,y为副版本号,z为发行版本号。例如,我的linux系统机器上zlib共享库的realname为     libz.so.1.2.8,这个文件是含有可执行的二进制代码的。

    2) 每个动态库都有一个以"lib"为前缀且以".so.x"为结尾的被称为 soname

    的特定名称,其中x为主版本号,soname命名格式通常为libxxx.so.x。例如,我的linux系统机器上zlib共享库的soname为libz.so.1。这个soname包含了动态库的主版本号,这个doname一般会包含在库代码的头文件中,这个可以使用 readelf -d 读取出来,使用这个动态库的程序的二进制ELF的头文件中包含有这个动态库的soname。程序运行时会按照这个名称去找真正的库文件。

    3) 此外,编译链依赖了共享库的应用模块时,链接器只认不带任何版本号的共享库名, 可以将库名称作" linker name。

    例如,我的linux系统机器上zlib共享库的linkername为libz.so。也即,链接使用了动态库的程序时查找的动态库名称。例如:gcc -o test test.o -lz , 链接时就会找libz.so 。若没有这个文件,链接器就报错。

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

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

相关文章

IC工程师职场必备《经典Verilog100多个代码案例》(附下载)

对于IC行业的人员而言,Verilog是最基础的入门,用于数字电路的系统设计,很多的岗位都会用到,可对算法级、门级、开关级等多种抽象设计层次进行建模。 Verilog由于其简单的语法,和C语言的相似性,目前被各大公…

uni-app:js时间与时间戳之间的转换

运行结果 代码 <template><view></view> </template><script>export default {data() {return {}},onLoad() {//时间转换为时间戳&#xff08;十位时间戳即秒级时间戳&#xff09;const time 2023-10-01 12:34:56; // 时间格式为年-月-日 时:分…

BlowFish加解密原理与代码实现

BlowFish加解密原理与代码实现 一丶简介 ​ BlowFish 是一个对称加密的加密算法。由Bruce Schneier&#xff0c;1993年设计的。是一个免费自由使用的加密算法。 了解的必要知识 BlowFish是一个对称区块加密算法。每次加密数据为 64位 &#xff08;2个int)类型数据大小。八个…

Maven 引入外部依赖

如果我们需要引入第三方库文件到项目&#xff0c;该怎么操作呢&#xff1f; pom.xml 的 dependencies 列表列出了我们的项目需要构建的所有外部依赖项。 要添加依赖项&#xff0c;我们一般是先在 src 文件夹下添加 lib 文件夹&#xff0c;然后将你工程需要的 jar 文件复制到 …

mac(M1)卸载miniconda3

参考https://stackoverflow.com/questions/29596350/how-to-uninstall-mini-conda-python step1 因为我目前只有一个base环境&#xff0c;所以直接在这个环境中安装 anaconda-clean即可 conda install anaconda-clean然后继续输入 anaconda-clean如果不加–yes&#xff0c;那…

精品Python考务监考管理系统

《[含文档PPT源码等]精品Python考务管理系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaSc…

SECS/GEM封装库RapidSecs开发手记HMSM

四. SECS/GEM封装库RapidSecs开发手记-基础库开发-1 https://blog.csdn.net/jxb_memory/article/details/105739410 secsgem https://www.cnpython.com/pypi/secsgem

95740-26-4|用于体内DNA合成的探针F-ara-EdU

产品简介&#xff1a;(2S)-2-Deoxy-2-fluoro-5-ethynyluridine&#xff0c;一种用于体内DNA合成的探针&#xff0c;其毒性比EdU和BrdU都小。当需要延长细胞存活时间和不受干扰的细胞周期进展时&#xff0c;非常适合进行代谢DNA标记。 CAS号&#xff1a;95740-26-4 分子式&…

2023腾讯云双11优惠活动服务器价格预测

2023腾讯云服务器双十一有活动吗&#xff1f;有的&#xff0c;双11轻量应用服务器和云服务器CVM均有活动&#xff0c;只是现在还未开启&#xff0c;一般为11月1日开始&#xff0c;活动时间持续1个月时间&#xff0c;腾讯云百科txybk.com预测一下2023年腾讯云服务器双十一优惠活…

链表常见问题

1.实现一个链表 public class Linked {public Node first;public Node last;//头插public void addFirst(int data){//获取原头节点Node f first;//创建新节点Node newNode new Node(data);//指向新头节点first newNode;//if(f null){last newNode;}else {newNode.next …

POI 和 EasyExcel 操作 Excel

一、概述 目前操作 Excel 比较流行的就是 Apache POI 和阿里巴巴的 easyExcel。 1.1 POI 简介 Apache POI 是用 Java 编写的免费开源的跨平台的 Java API&#xff0c;Apache POI 提供 API 给 Java 程序对 Microsoft Office 格式文档读和写的常用功能。POI 为 “Poor Obfuscati…

【工作流引擎】Activiti的使用01

基础配置 依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM…

Promise resolver undefined is not a function

错误的代码 function handlUsernameOrEmail(rules,value,){const regex /^([a-zA-Z0-9_-])([a-zA-Z0-9_-])(\.[a-zA-Z0-9_-]){1,2}$/;if(regex.test(value)){return new Promise().resolve(成功);}else {return new Promise().reject(失败);}// console.log(rules,rules,valu…

图文详解六十道Java并发

图文详解六十道Java并发 基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单位。 并行就是同一时刻,两个线程都在执行。这就要求有两个CPU去分别执行两个线程。并发就是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。并发的实现依…

三、机器学习基础知识:Python常用机器学习库(Numpy第一部分)

文章目录 1、Numpy定义2、ndarray对象3、Numpy数据类型4、Numpy数组类型 1、Numpy定义 Numpy是Numberical Python的简称&#xff0c;是用来进行高性能计算与分析的基础包&#xff0c;是Python中重要的扩充库。它支持高维度数组与矩阵运算&#xff0c;也针对数组运算提供了大量…

gradle依赖导入,jar方式

新项目使用了gardle方式导入依赖&#xff0c;但是很不巧我都没有听过这个东西&#xff0c;然后就紧急的学了学&#xff0c;发现其实也听见的&#xff0c;然后准备动手试一下 问题 导入dm数据库驱动&#xff0c;换了好几种写法也不大行&#xff0c;然后发现我之前的项目也是使…

IDERA ER/Studio Data Professional 19.3.5 Crack

IDERA ER/Studio 数据架构师&#xff1f; 它能够从用户的单个界面创建和管理多个数据库平台的数据模型。信息建模者和架构师希望对与小型企业需求相关的不同数据高度做出反应。有些关键行动可能需要他们的关注。 特点&#xff1a; 构建数据模型作为增长周期的一部分。发现并记…

Redis的C客户端(hiredis库)使用

文章目录 1、Ubuntu安装redis服务端2、hiredis库的安装3、同步API接口的使用3.1、连接redis数据库redisConnect3.2、发送需要执行的命令redisCommand3.3、redisCommandArgv函数3.4、redisAppendCommand*函数支持管道命令3.5、释放资源3.6、同步连接代码 3.7、异步连接4、redis连…

Docker+jenkinsPipeline 运行实现python自动化测试

一、实现思路 在 Linux 服务器安装 docker创建 jenkins 容器jenkins 中创建 pipeline 项目根据自动化项目依赖包构建 python 镜像(构建自动化 python 环境)运行新的 python 容器&#xff0c;执行 jenkins 从仓库中拉下来的自动化项目执行完成之后删除容器 二、环境准备 Lin…

centos7上 ytalk 命令找不到?yum没有ytalk的软件包

1.描述 [rootoomcserver ~]# yum search ytalk Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. Repodata is over 2 weeks …