linux静态库和共享库-程序员宅基地

技术标签: linux应用程序  library  gcc  平台  linux  windows  

1.什么是库
在windows平台和linux平台下都大量存在着库。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
由于windows和linux的本质不同,因此二者库的二进制是不兼容的。
本文仅限于介绍linux下的库。


2.库的种类
linux下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。


3.库存在的意义
库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。


4.库文件是如何产生的在linux下
静态库的后缀是.a,它的产生分两步
Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表
Step 2.ar命令将很多.o转换成.a,成文静态库
动态库的后缀是.so,它由gcc加特定参数编译产生。
例如:

$ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.


5.库文件是如何命名的,有没有什么规范
在linux下,库文件一般放在/usr/lib /lib下,
静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称
动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号


6.如何知道一个可执行程序依赖哪些库
ldd命令可以查看一个可执行程序依赖的共享库,
例如
# ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)
/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
可以看到ln命令依赖于libc库和ld-linux库


7.可执行程序在执行的时候如何定位共享库文件
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径
此时就需要系统动态载入器(dynamic linker/loader)
对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的
DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib目录找到库文件后将其载入内存


8.在新安装一个库之后如何让系统能够找到他
如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。
如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下
1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
2.运行ldconfig,该命令会重建/etc/ld.so.cache文件
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abc19842008/article/details/1923159

智能推荐

SpringBoot测试启动报错Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No quali_error creating bean with name 'com.example.demo.de-程序员宅基地

文章浏览阅读5.4k次。SpringBoot项目中,使用Test类进行启动时,报错如下:Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.pojo.Person' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annota_error creating bean with name 'com.example.demo.demoapplicationtests': unsat

HDFS NN与2NN_、 根据自己对hdfs的理解,描述一下2nn如何对nn的元数据进行合并?-程序员宅基地

文章浏览阅读343次。HDFS元数据管理机制问题1:NameNode如何管理和存储元数据?计算机中存储数据两种:内存或者是磁盘元数据存储磁盘:存储磁盘无法面对客户端对元数据信息的任意的快速低延迟的响应,但是安全性高元数据存储内存:元数据存放内存,可以高效的查询以及快速响应客户端的查询请求,数据保存在内存,如果断点,内存中的数据全部丢失。解决方案:内存+磁盘;NameNode内存+FsImage的文件(磁盘)新问题:磁盘和内存中元数据如何划分两个数据一模一样,还是两个数据合并到一起才是一份完整的数据呢?一模一样:_、 根据自己对hdfs的理解,描述一下2nn如何对nn的元数据进行合并?

linux命令之`cp`与`scp` - 站着说话不腰疼-程序员宅基地

文章浏览阅读212次。cp与scp命令的都是复制文件或目录,区别就是,cp只能在自己服务内进行copy,而scp可以跨服务器进行copy。

使用Aspose在C#中将PLT转换为PDF或JPEG图像_c# 读取plt文件 生成图像-程序员宅基地

文章浏览阅读919次。PLT是用于绘图仪机器的基于矢量的格式。但是,只有少数应用程序支持此格式,因此可能需要根据需要转换为更兼容的格式。使用Aspose只需几个简单的步骤即可将PLT文件转换为PDF,PNG或JPEG图像。让我们学习以下部分以获取更多详细信息:在C#中将PLT转换为PDF文件 在C#中将PLT转换为JPEG图像Aspose.CAD是一个独立的AutoCAD处理API。它提供将DWG,DWF和DXF文件转换为高质量PDF和光栅图像的功能。开发人员可以从AutoCAD文件中选择和转换特定的布局和图层,并轻松跟_c# 读取plt文件 生成图像

作业管理系统设计报告_作业管理专业设计报告-程序员宅基地

文章浏览阅读7.8k次,点赞4次,收藏123次。目录一、 引言(Introduction). 31. 背景(Background). 32. 开发计划的目的. 33. 项目开发参考资料(References). 44. 涉及名词(Related Noun). 4二、 项目概述. 51. 项目目标. 52. 功能模块列表. 5三、 计算机系统支持及开发环境. 71. 开发技术:. 72. 开发硬件. 73. 服务器环境. 74...._作业管理专业设计报告

VisionPro工具与命名空间对照表-程序员宅基地

文章浏览阅读5.4k次,点赞10次,收藏100次。VisionPro工具对应的命名空间项次 分类 名称 命名空间 1 无分类 CogAcqFifoTool Cognex.VisionPro.CogAcqFifoTool 2 CogBlobTool Cognex.VisionPro.Blob 3 CogCaliperTool Cognex.VisionPro.Caliper 4 CogCNLSearchTool C..._visionpro工具与命名空间对照表

随便推点

飞歌G7导航安装激Poweramp(安卓)_poweramp hd-程序员宅基地

文章浏览阅读6.9k次。安装Poweramp和购买可以参考下面这个文章,由于支持支付宝,所以购买过程很简单,注意的是购买时要写好邮箱,这个邮箱在接收购物订单号和激 时要用到:http://www.mk52.cn/jiaocheng/1840.htmlPowerAMP作为安卓最好的音乐播放器,没有之一。  喜欢它的机友,如果受不了PowerAMP破解不全,常常不一会儿就要重新破解的,而想购买正版_poweramp hd

使用java正则表达式过滤HTML ,获取<body>标签中的内容解决思路-程序员宅基地

文章浏览阅读805次。2019独角兽企业重金招聘Python工程师标准>>> ..._正则表达式匹配body

oracle改ip后orcale服务没法启动_oracle换ip后 oracle 19c 企业版监听服务无法启动,某些服务在未由其他服务或程序-程序员宅基地

文章浏览阅读1.1k次。今天配置虚拟机中设计了下ip,使虚拟机和主机处在同一网段,然后使用webservice就成功了,但是新问题就来了,oracle连接不上了,,一查找资料,发现OracleOraDb10g_home1TNSListener服务启动了自动关闭了,,再启动怎么也启动不了,想想肯定跟改ip有关,一查果然是这个问题,用了下面方法立马成功了:1.在cmd环境下运行emca -config d_oracle换ip后 oracle 19c 企业版监听服务无法启动,某些服务在未由其他服务或程序

FATFS文件系统复制文件_fatfs拷贝文件-程序员宅基地

文章浏览阅读6.3k次。原帖地址:刚刚完成了fatfs下面的文件夹复制,貌似没有问题,Traids之前说的文件夹复制有问题,可以参考一下我这个代码 验证了一下SYSTEM文件夹的COPY,没有问题.以下代码需要用到malloc,在论坛我已经发帖过,可以搜索一下,或者使用系统的malloc.//文件复制//将psrc文件,copy到pdst.//psrc,pdst:源文件和目标文件//fwmode:文件_fatfs拷贝文件

AUTOSAR中各BSW模块_“模块缩写”_“参考文档”以及所属“AUTOSAR软件层级”清单_autosar全局缩写在哪个文档-程序员宅基地

文章浏览阅读5.7k次,点赞8次,收藏73次。目录一、AUTOSAR底层软件BSW模块清单:二、AUTOSAR库清单:三、AUTOSAR特殊文件清单:四、结尾:一、AUTOSAR底层软件BSW模块清单:该清单中详细介绍了各Autosar BSW模块的“缩写”、“参考文档”以及所属的“AUTOSAR软件层级”。Module short name Module abbreviation (API service prefix) Module ID (uint16) Specification d..._autosar全局缩写在哪个文档

Windows 下开启 Telnet 命令-怎么打开telnet端口_window telnet-程序员宅基地

文章浏览阅读5.7k次。windows下开启 telnet 命令_window telnet

推荐文章

热门文章

相关标签