【Linux】动静态库的使用
📝前言:
这篇文章我们来讲讲Linux——动静态库的使用
🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏
这里写目录标题
- 一,什么是库
- 二,静态库
- 认识静态库
- 形成静态库
- 查看库的详细信息
- 使用静态库
- 源文件链接库形成可执行文件
- 三,动态库
- 认识动态库
- 形成动态库
- 使用动态库
- 查看链接关系
- 添加动态库
- 把头文件添加到默认路径
- 四,使用外部库
一,什么是库
基本概念:
- 库是写好的现有的,成熟的,可以复用的代码
- 静态库:
.a[Linux]、.lib[windows]
- 动态库:
.so[Linux]、.dll[windows]
- 库的命名规则,前缀
lib
+NAME
+ 后缀库类型
(其中真正的库名是NAME
)- 示例:名字为
c
的静态库:libc.a
、.a
后面还可以跟其他后缀
- 示例:名字为
动静态库的形成:
- 动静态库,通常都是由
.o
文件打包来的 .o
文件是编译后形成的可重定向目标文件
二,静态库
认识静态库
- 静态库在链接的时候,把用到的库函数的代码链接(拷贝)到可执行文件中,后续运行时不再需要静态库
形成静态库
多个.o
文件打包成静态库示例:
Makefile文件:
1 libmyc.a: mystdio.o mystring.o 2 ar -rc $@ $^3 %.o:%.c4 gcc -c $<5 .PHNOY:clean6 clean:7 rm -rf *.a *.o8
ar
:归档打包,打包完以后,未来不用解包,可以直接使用gcc/g++
链接
运行示例:
查看库的详细信息
ar -tv 库
可以查看库
的信息:
使用静态库
源文件链接库形成可执行文件
使用gcc
链接:
- 选项
-l
:接要链接的库名称 - 选项
-L
:接要找的库所在的目录路径(不带-L
系统去默认路径下找库) - 选项
-I
:接要找的头文件所在的目录路径(不带-I
,系统去默认路径下找头文件,并且会在当前目录找)
使用静态库链接,形成可执行文件示例:
gcc -o test test.c -I ./ -L ./ -l myc
上面这种写法就是全链路写法。一旦静态库链接成功,本质已经把对应的库函数代码拷贝给了可执行文件,后续无序找库,一定能运行成功。
- 当动静态库同时存在的时候,
gcc
会默认使用动态库。如果非要使用静态库,需要带-static
选项(带了这个选项,就必须存在对应的静态库)
三,动态库
认识动态库
- 动态库(
.so
):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 - 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。
- 动态库是运行时链接,运行时还需要依赖动态库。不像静态库一旦编译链接成功以后就一定可以运行成功。
形成动态库
- 动态库用
gcc
打包, 带-shared
选项 - 形成的
.o
文件要带-fPIC
选项(用于生成位置无关代码,动态库的.o
文件要求)
Makefile文件:
1 libmyc.so: mystdio.o mystring.o2 gcc -o $@ $^ -shared 3 %.o:%.c4 gcc -fPIC -c $<5 .PHONY:clean6 clean:7 rm -rf *.so *.o
使用动态库
同样有三种使用方法:
// 场景1:头⽂件和库⽂件安装到系统路径下(不带 -I 和 -L 都去系统路径找)
gcc main.c -lmystdio// 场景2:头⽂件和库⽂件和我们⾃⼰的源⽂件在同⼀个路径下(不带 -I 头文件回去当前目录找)
gcc main.c -L. -lmymath // 从左到右搜索-L指定的⽬录// 场景3:头⽂件和库⽂件有⾃⼰的独⽴路径(都不在当前路径,找不到就要指明路径)
gcc main.c -I头⽂件路径 -L库⽂件路径 -lmymath
示例:
但是,为什么编译链接,形成可执行文件后,还是运行不了,说没找到?
查看链接关系
ldd + 可执行文件名
,可查看链接的动态库
我们发现,libmyc.so
是not found
。这是因为,我们前面提供的-L
只是告诉了编译器,但是系统任然不知道我们的动态库在哪里。
解决方法如下:
添加动态库
- 直接把库拷贝一份到系统默认找库的文件夹,一般是:
/usr/lib、/usr/local/lib、/lib64
(但是这不推荐,会污染系统目录) - 在系统默认拷贝的文件夹里面添加对应动态库的软链接
- 更改环境变量:
LD_LIBRARY_PATH
(这个变量有可能为空,我们可以自行export
导入) - 配置
/etc/ld.so.conf.d/
:在这个目录下新建一个任意名称的配置文件,然后再文件里面放动态库的路径(系统会默认去里面找)【但是这个好像写不进去】- 改完这个配置以后,
ldconfig
可以重新加载配置,才能生效
- 改完这个配置以后,
我们使用解决方法3
,添加后,运行程序:
export LD_LIBRARY_PATH="/home/tr/code/Linux_learn/library_un:$LD_LIBRARY_PATH"
:
:用来分割路径$LD_LIBRARY_PATH
:获取原来的环境变量值,然后再次基础上添加- 建议使用绝对路径
此时就链接上了,a.out
运行结果:
把头文件添加到默认路径
- 同样,头文件有默认搜索的路径:
/usr/include
。我们可以拷贝文件进去,或者建立软链接 - 设置
CPATH
环境变量(针对 C 语言)或者CPLUS_INCLUDE_PATH
环境变量(针对 C++) - 但是更建议:
-I
四,使用外部库
库的安装,就是把库对应的文件拷贝到了指定(默认搜索)的目录下
这里我们安装一个ncurse
库
我们可以查看一下/usr/lib
或 /usr/include
,看看有没有这个外部库的库文件和头文件
/usr/include
里面的
我们简单使用一下(参考文章:ncurse编程指南),在屏幕左上角打印Hello, World
:
1 #include <ncurses.h> 2 3 int main()4 {5 initscr(); // 初始化屏幕,默认stdscr6 printw("Hello World");// 与printf相似但是打印到虚拟窗口stdscr7 8 refresh();// 需要刷新才能显示到屏幕上9 getch(); // 等待用户输入10 endwin(); // 关闭窗口11 return 0;12 }
编译链接,gcc -o test2 test2.c -lncurses
,并运行:
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!
相关文章:

【Linux】动静态库的使用
📝前言: 这篇文章我们来讲讲Linux——动静态库的使用 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入门基础&…...

Java基础(网络编程)
一、概述 目的:网络通信: 1、设备和设备 2、进程和进程 1)不同设备之间 2)本地设备之间 需要解决的问题: 如何准确地发送到对方的主机 - IP地址 - 唯一的定位网络中的一台主机 如何准确的发送到对方主机的进程 -…...

计量——异方差的检验及其修正
目录 1.异方差的检验 1 BP检验 2white检验 2.异方差的修正 1.异方差的检验 1 BP检验 选择检验方法:BP BP检验的实际步骤(非机器): 1.y对所有x进行回归,得到残差u。计算残差的平方u^2 2.u^2对所有x进行回归&#…...

学习C++的好书:C++编程之禅
历时四个月,把这本书看了一遍,受益匪浅,推荐给大家,系统的学习一遍C。...

OpenCV进阶操作:人脸检测、微笑检测
文章目录 前言一、OpenCV如何实现人脸检测1、haar特征2、级联分类器3、级联分类器的使用 二、人脸检测、微笑检测 案例实现1、预处理2、加载分类器3、标注人脸4、运行结果:4、微笑检测 总结 前言 要实现人脸识别首先要判断当前图像中是否出现了人脸,这就…...

车载诊断进阶篇 --- 车载诊断概念
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

制作一款打飞机游戏49:敌人抖动
蛇形敌人 如果你玩过一些射击游戏(shmups),尤其是老式的射击游戏,你可能会遇到一种敌人,它们像蛇一样移动。我想在我们的游戏中实现这种效果。这种动态的感觉非常棒,我们完全有能力通过动画来实现它。 方…...
elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能
本文介绍了基于 ElementPlus 的 el-tree 组件进行二次封装的 TreeView 组件,使用 Vue3 和 JavaScript 实现。TreeView 组件通过 props 接收树形数据、配置项等,支持懒加载、节点展开/收起、节点点击、删除、编辑等操作。组件内部通过 ref 管理树实例&…...

Pycharm IDEA加载大文件时报错:The file size exceeds configured limit
解决方案:配置一下idea.properties文件 文件里面写入代码: idea.max.intellisense.filesize50000重启IDEA即可;...
free void* 指令
https://stackoverflow.com/questions/2182103/is-it-ok-to-free-void free(ptr) 仅释放指针指向的内存,不会修改指针变量本身的值。调用后,ptr 仍然指向原来的地址(称为 "悬空指针"),但该地址对应的内存已…...

PDA手持终端应用有哪些?
随着技术进步不断拓展,PDA手持终端其便携性与多功能特性使其成为多行业数字化转型的核心工具。主要包括物流与仓储管理、零售行业、医疗行业以及制造业等。 1.物流与仓储管理 在物流与仓储管理中,PDA手持终端主要用于物品的实时跟踪、库存管理和拣货作业…...
Python模块化编程
Python模块化编程 记得我刚学Python那会儿,特别喜欢把所有代码都写在一个文件里。直到有一天,我的项目膨胀到了2000多行代码,每次修改都要翻半天…这才痛定思痛,开始研究模块化编程。今天就跟大家聊聊这个让代码变得优雅的魔法。…...
Linux性能分析工具perf
perf 工具详解 perf(Performance Counters for Linux)是 Linux 系统上的一个强大的性能分析工具,用于监控和分析系统及应用程序的性能。它基于 Linux 内核的 Performance Event Subsystem(perf_events),能…...
Android开发-使用内容组件获取通讯信息
在Android开发中,访问和处理用户的通讯信息(如联系人、通话记录等)是一项常见的需求。通过使用Android的内容提供者(ContentProvider),开发者可以方便地查询这些数据,并将其集成到自己的应用中。…...
文件目录与检索综合练习题
文章目录 前言一、基础部分二、参数应用三、参数进阶四、组合应用五、归档压缩六、统计与分析总结 前言 这部分练习题帮助大家更好的掌握命令 一、基础部分 1.用grep在error.log中查找所有含"Timeout"的行 2.使用find在/var/log下搜索7天内修改过的.log文件 3.对da…...

Python+Selenium爬虫:豆瓣登录反反爬策略解析
1. 引言 在当今互联网时代,数据抓取(爬虫)技术广泛应用于数据分析、市场调研、自动化测试等领域。然而,许多网站采用动态加载技术(如Ajax、React、Vue.js等框架)来渲染页面,传统的**<font s…...
信息系统运行管理员:临阵磨枪版
信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料,力求完整覆盖考点细节) 第一部分:基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息: 含义:香农 - 减少随机不确定性的东西;…...

电总协议调试助手更新-PowerBus-v1.0.5
电总协议调试助手,该工具主要是用于打包电总协议,用于电总协议的设备调试(精密空调、UPS、基站电源等等)。电总协议校验计算、编码转换比较麻烦,手动组包困难,使用该工具可以大大提高调试效率。 Ver1.0.5版…...

技术文档:变频器干扰问题与解决方案
1. 引言 在现代工业自动化系统中,变频器(Variable Frequency Drive, VFD)因其高效节能和精确调速的特点被广泛应用于电机控制。然而,变频器在运行过程中会产生高频电磁干扰(EMI),对周边设备如P…...

2025认证杯数学建模C题思路+代码+模型:化工厂生产流程的预测和控制
2025认证杯数学建模C题思路代码模型,详细内容见文末名片 在化工厂的生产流程中,往往涉及到多个反应釜、管道和储罐等设备。在 流水线上也有每个位置的温度、压力、流量等诸多参数。只有参数处于正常范 围时,最终的产物才是合格的。这些参数…...

亚马逊,temu测评采购低成本养号策略:如何用一台设备安全批量管理买家账号
只要能够巧妙规避平台的检测和风控措施,测评便可安全进行。 自养号测评,它更便于卖家掌控,且能降低风险。现在很多卖家都是自己养号,自己养号都是精养,不是自动的机刷,买家账号掌握在自己手里,更…...

SiFli-SDK 编译
1.编译报错 scons: *** No SConstruct file found. 出现这个错误是没有正确进入到工程目录执行编译命令,例如应该进入project目录中。 2.scons: *** [build_em-lb525_hcpu\src\resource\strings\en_us.c] AttributeError : dict object has no attribute iteritem…...
React 第四十一节Router 中 useActionData 使用方法案例以及注意事项
一、useActionData前言 useActionData 是 React Router 提供的一个钩子函数,用于获取在路由的 action 函数中返回的数据。它通常与表单提交(通过 <Form> 组件)配合使用,用于处理表单提交后的服务器响应数据(如错…...

C++多态实现的必要条件剖析
在C中,多态的一个必要条件确实是通过基类的指针或引用调用虚函数。这一要求背后的原因与C如何实现动态绑定(运行时多态)密切相关。下面详细解释了为什么需要使用基类的指针或引用来实现多态。 动态绑定与静态绑定 静态绑定(编译期…...

C语言_自动义类型:联合和枚举
1. 联合体 1.1 联合体类型的声明 与结构体相似,联合体也是有一个或多个成员(可以是不同类型)构成;但是编译器只为最大的成员分配足够的内存空间 联合体的特点是所有成员共用同一块内存空间,所以联合体也叫ÿ…...

汽车紧固件涂层18问:看敦普无铬锌铝涂料如何为螺丝防锈防腐
导读 在汽车紧固件防锈涂装领域,敦普牌紧固件无铬锌铝涂料,是专为汽车紧固件打造的水性涂料,集防锈、环保、高性价比于一体。它有何独特之处?让我们一探究竟。 1、敦普紧固件无铬锌铝涂料是什么产品? 敦普紧固件无铬…...

掘金中亚货代蓝海,易境通货代系统解锁数字化制胜密码!
2025年,中亚地区正成为全球物流行业的新蓝海。中亚五国因其独特的地缘位置和“一带一路”倡议的深化推进,正逐渐成为全球物流行业的战略要地。 在政策红利、基建升级与市场需求的叠加效应下,中亚物流市场预计在2025年迎来爆发式增长。但传统…...
Python内存管理:赋值、浅拷贝与深拷贝解析
赋值与共享资源 在Python中,直接赋值操作(如 list2 list1)会导致两个变量共享同一个内存地址。这意味着对 list1 的修改会直接影响到 list2,因为它们指向同一个对象。 注意: 赋值等于完全共享资源 如果我们不希望这样完全共享&…...

W1R3S: 1.0.1靶场
W1R3S: 1.0.1 来自 <W1R3S: 1.0.1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.249 3,对靶机进行端口…...
深度学习-分布式训练机制
1、分布式训练时,包括train.py的全部的代码都会在每个gpu上运行吗? 在分布式训练(如使用 PyTorch 的 DistributedDataParallel,DDP)时,每个 GPU 上运行的进程会执行 train.py 的全部代码,但通过…...