Linux 静态库与动态库的制作与使用

        在Linux中,库library是一组函数和资源的集合,他们可以被不同的程序共享和使用,库的主要目的是代码重用,减少内存占用,并简化程序的维护。

Linux操作系统支持的函数库分为:静态库和动态库。

        静态库(Static Library)

  •         libxxx.a,通常以.a为文件后缀,
  •         在编译时就将库编译进可执行程序中,每个使用该库的程序都会有一份库代码的副本。
  •         优点:程序的运行环境中不需要外部的函数库。
  •          缺点:可执行程序大,内存使用效率低,库更新需重新编译。

动态库(Dynamic Library)

  •         又称共享库,通常以.so(shared object)为文件后缀。
  •         在编译时,程序只记录了动态库的位置和所需的函数接口,而不是将库代码直接复制到可执行文件中。运行时,操作系统负责加载所需的库。
  •         优点:可执行程序小,因为库代码不是直接包含在程序中。 库更新不需要重新编译,多个程序可以共享一份库代码,节省内存。
  •         缺点:程序的运行环境中必须提供相应的库。增加程序的依赖性,动态链接可能会影响程序的启动速度(因为在运行时需要解析库)。还需要保证库的版本与程序兼容,否则会出错。
函数库目录:/lib /usr/lib

静态库与动态库的选择:

选择使用静态库还是动态库通常取决于具体的需求:

  • 如果程序需要在没有网络连接的环境中运行,或者需要最小化可执行文件的大小,可能会选择静态库。
  • 如果希望减少内存占用,或者需要频繁更新库而不重新编译程序,动态库可能是更好的选择。

静态库的制作与使用:        

编写简单函数:

编写链接的源代码:

1.编写源代码为静态库:

通过命令 gcc sub.c -c -o sub.o

将源代码编译成目标文件(.o 文件),然后使用 ar 工具将这些目标文件打包成静态库。

ls - l 查看  sub.c 为源文件,sub.o为目标文件。

ar -cr -o libsub.a sub.o (静态函数库创建命令)

ar ‐cr libfile.a file.o

‐c: create的意思

‐r: replace的意思,表示当插入的模块file.o已经存在libfile.a中,则覆盖。反之ar显示一个错误消息。

libsub.a 创建成功:

2.编译程序时链接静态库:

gcc -o myprogram myprogram.c -L/path/to/library -lmylib
  • -L/path/to/library 指定静态库的搜索路径。
  • -lmylib 指定要链接的库(编译器会自动寻找 libmylib.a 文件)。

shell命令:

gcc main.c   -L.  -lsub

编译链接我们刚才写的代码文件。

执行中间文件:

./a.out

输出结果,证明我们链接成功。

确保头文件可访问

如果静态库中的函数需要包含头文件,确保在编译程序时指定头文件的路径。

gcc -o myprogram myprogram.c -L/path/to/library -lmylib -I/path/to/header
  • -I/path/to/header 指定头文件的搜索路径。

操作静态库的几个实例:

        情况1: 如果从别处得到一个静态库libunknown.a,想知道其中包含哪些模块。

命令:ar -t libunknown.a

静态库的编译:gcc -o main main.c -L. -lfile

  • 编译main.c就会把静态函数库整合进main。
  • 其中: -L指定静态函数库的位置供查找,注意L后面还有'.',表示静态函数库在本目录下查找。
  • -l则指定了静态函数库名,由于静态函数库的命名方式是lib***.a,其中的lib和.a忽略。

删除libaddsub.a后main依然可以运行,因为静态库的内容已经整合进去了。

 动态库的制作与使用:

1.编写源代码

首先编写你的库函数的源代码。这里使用刚才静态库的代码。

命令:gcc sub.c -c  -o sub.o   将源代码编译为目标文件,o。

2.编译源代码为位置无关代码,生成动态库:

gcc -fpic -shared -o libsub.so sub.o

 ‐fpic:产生位置无关代码。

‐shared:生成共享库。

-o output 缩写,输出为:

linsub.so的动态库。

sub.o:这是要被链接成动态库的目标对象文件。

用上述命令生成libaddsub.so 动态函数库。

生成libsub.so 动态库的可执行文件。

3.编译时链接动态库

方法一:
gcc main.c -o main  -L.  -lsub

 

此时还不能立即./out,因为在动态函数库使用时,会查找/usr/lib /lib目录下的动态函数库,而此时我们生成的库 不在里边。

第一种方法: libaddsub.so放到/usr/lib 或/lib中去。

sudo mv libsub.so /usr/lib

此时通过这条命令,我们已经将libsub.so 这个动态库文件移到/usr/lib里面去。

然后回到用户目录执行main,可以得知动态库链接成功。

记得将目录移回来:

方法二:

第二种方法,假设libfile.so在/home/linux/file 环境变量方法

export LD_LIBRARY_PATH=/home/linux/addsub:$LD_LIBRARY_PATH

终端关闭环境变量将会重置。 

 

export 命令用于设置或导出环境变量,使得这些变量在当前 shell 会话中可用,并且可以在子进程中继承。 

echo 命令在 Linux 和其他类 Unix 系统中用于在终端打印文本或变量的值。它常用于脚本中以输出信息或用于命令行中以显示数据。

执行main。链接成功。

方法三:

第三种方法: 在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。

sudo vi /etc/ld.so.conf

/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是 从/usr/lib /lib中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。

/sbin/ldconfig 是 Linux 系统中用于配置动态链接器运行时绑定的命令。它主要负责创建、更新和删除动态链接库的缓存文件,以及检查动态链接库的版本信息和依赖关系。这个命令对于管理系统中的共享库非常重要,因为它确保了在运行时能够找到正确的动态链接库。

在此目录下,添加动态库目录的路径。 

sudo ldconfig /etc/ld.so.conf

 

ldconfig 命令是 Linux 系统中用于配置动态链接器的命令。它主要用来创建和更新动态链接库的缓存,以便在程序运行时能够快速找到所需的库文件

ldconfig 命令会根据 /etc/ld.so.conf 文件以及 /etc/ld.so.conf.d/ 目录下的所有 .conf 文件中指定的路径来查找动态链接库,并更新缓存。

执行main。链接成功。

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

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

相关文章

【线程池】Tomcat线程池

版本:tomcat-embed-core-10.1.8.jar 前言 最近面试被问到 Tomcat 线程池,因为之前只看过 JDK 线程池,没啥头绪。在微服务横行的今天,确实还是有必要研究研究 Tomcat 的线程池 Tomcat 线程池和 JDK 线程池最大的不同就是它先把最…

二分+优先队列例题总结(icpc vp+牛客小白月赛)

题目 思路分析 要求输出最小的非负整数k,同时我们还要判断是否存在x让整个序列满足上述条件。 当k等于某个值时,我们可以得到x的一个取值区间,若所有元素得到的x的区间都有交集(重合)的话,那么说明存在x满足条件。因为b[i]的取值为1e9&…

Maven-一、分模块开发

Maven进阶 文章目录 Maven进阶前言创建新模块向新模块装入内容使用新模块把模块部署到本地仓库补充总结 前言 分模块开发可以把一个完整项目中的不同功能分为不同模块管理,然后模块间可以相互调用,该篇以一个SSM项目为目标展示如何使用maven分模块管理。…

没错,我给androidx修了一个bug!

不容易啊,必须先截图留恋😁 这个bug是发生在xml中给AppcompatTextView设置textFontWeight,但是却无法生效。修复bug的代码也很简单,总共就几行代码,但是在找引起这个bug的原因和后面给androidx提pr却花了很久。 //App…

云手机的海外原生IP有什么用?

在全球数字化进程不断加快的背景下,企业对网络的依赖程度日益加深。云手机作为一项创新的工具,正逐步成为企业优化网络结构和全球业务拓展的必备。尤其是云手机所具备的海外原生IP功能,为企业进入国际市场提供了独特的竞争优势。 什么是海外原…

DNF Decouple and Feedback Network for Seeing in the Dark

DNF: Decouple and Feedback Network for Seeing in the Dark 在深度学习领域,尤其是在低光照图像增强的应用中,RAW数据的独特属性展现出了巨大的潜力。然而,现有架构在单阶段和多阶段方法中都存在性能瓶颈。单阶段方法由于域歧义&#xff0c…

如何使用 3 种简单的方法将手写内容转换为文本

手写比文本更具艺术性,这就是许多人追求手写字体的原因。有时,我们必须将手写内容转换为文本,以便于存储和阅读。本文将指导您如何轻松转换它。 此外,通常以扫描的手写内容编辑文本很困难,但使用奇客免费OCR&#xff…

视觉距离与轴距离的转换方法

1.找一个明显的参照物,用上方固定的相机拍一下。保存好图片 2.轴用定长距离如1mm移动一下。 3.再用上相机再取一张图。 4.最后用halcon 将两图叠加 显示 效果如下 从图上可以明显的看出有两个图,红色标识的地方。 这时可以用halcon的工具画一个长方形…

Cesium 绘制可编辑点

Cesium Point点 实现可编辑的pointEntity 实体 文章目录 Cesium Point点前言一、使用步骤二、使用方法二、具体实现1. 开始绘制2.绘制事件监听三、 完整代码前言 支持 鼠标按下 拖动修改点,释放修改完成。 一、使用步骤 1、点击 按钮 开始 绘制,单击地图 绘制完成 2、编辑…

误差评估,均方误差、均方根误差、标准差、方差

均方根误差 RMSE/RMS 定义 RMSE是观察值与真实值偏差的平方,对于一组观测值 y i y_i yi​ 和对应的真值 t i t_i ti​ R M S E 1 n ∑ i 1 n ( y i − t i ) ,其中n是观测次数 RMSE\sqrt{\frac1n \sum_{i1}^n (y_i-t_i)} \text{,其中n是…

2.个人电脑部署MySQL,傻瓜式教程带你拥有个人金融数据库!

2.个人电脑部署MySQL,傻瓜式教程带你拥有个人金融数据库! ‍ 前边我们提到,比较适合做量化投研的数据库是MySQL,开源免费。所以今天我就写一篇教程来教大家如何在自己的环境中部署MySQL。 在不同的设备或系统中安装MySQL的步骤…

局部凸空间及其在算子空间中的应用之四——归纳极限空间2

局部凸空间及其在算子空间中的应用之四——归纳极限空间2 前言一、归纳极限拓扑中极限的含义总结 数学的真理是绝对的,它超越了时间和空间。——约翰冯诺伊曼 前言 在上一篇文章中,我们讨论了归纳极限拓扑的概念和与连续线性算子有关的一个重要结论。认…

为什么编程很难?

之前有一个很紧急的项目,项目中有一个bug始终没有被解决,托了十几天之后,就让我过去协助解决这个bug。这个项目是使用C语言生成硬件code,是更底层的verilog,也叫做HLS开发。 项目中的这段代码并不复杂,代码…

postman控制变量和常用方法

1、添加环境: 2、环境添加变量: 3、配置不同的环境:local、dev、sit、uat、pro 4、 接口调用 5、清除cookie方法: 6、下载文件方法:

calibre-web报错:File type isn‘t allowed to be uploaded to this server

calibre-web报错:File type isnt allowed to be uploaded to this server 最新版的calibre-web在Upload时候会报错: File type isnt allowed to be uploaded to this server 解决方案: Admin - Basic Configuration - Security Settings 把…

2024PDF内容修改秘籍:工具推荐与技巧分享

现在我们使用PDF文档的频率越来越高了,很多时候收到的表格之类的资料也都是PDF格式的,如果进行转换之后编辑再转换为PDF格式还是有点麻烦的,那么pdf怎么编辑修改内容呢?这篇文章我将介绍几款可以直接编辑PDF文件的工具来提高我们的…

鸿蒙next 带你玩转鸿蒙拍照和相册获取图片

前言导读 各位网友和同学,相信大家在开发app的过程中都有遇到上传图片到服务器的需求,我们一般是有两种方式,拍照获取照片或者调用相册获取照片,今天我们就分享一个小案例讲一下这两种情况的实现。废话不多说我们正式开始 效果图…

安全带检测系统源码分享

安全带检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

Linux,uboot,kernel启动流程,S5PV210芯片的启动流程,DRAM控制器初始化流程

一、S5PV210芯片的DRAM控制器介绍、初始化DDR的流程分析 1、DRAM的地址空间 1)从地址映射图可以知道,S5PV210有两个DRAM端口。 DRAM0的内存地址范围:0x20000000~0x3FFFFFFF(512MB);DRAM1:的内存地址范围…

HarmonyOS---权限和http/Axios网络请求

网络请求(http,axios) 目录 一、应用权限管理1.1权限的等级1.2授权方式1.3声明权限的配置1.4如何向用户进行申请 二、内置http请求使用三、Axios请求使用(建议)3.1 使用方式一3.2 使用方式二(建议) 一、应用权限管理 应用权限保护…