库_计算机库-程序员宅基地

技术标签: c语言  

【1】库的概念

1.什么是库

  1. 库是一个二进制可执行的文件。
  2. 库需要被载入到内存中才能使用
  3. 相比较可执行的二进制程序,库是不能单独运行的。
  4. windows和linux都有自己的库,不兼容的。

2.库的分类

1.动态库(共享库)
2.静态库
区分:通过库的后缀来区分库的类型

windows linux
静态库 *.lb libxxx.a
动态库 *.lld libxxx.so

3.库存在的意义

库是已经写好的,成熟的,可以复用的代码。
其实我们写的很多代码,都是依赖于基础库的,例如:printf scanf

【2】静态库

1.静态库的原理

通过静态库封装功能函数,在程序编译到链接库的时候,会将函数继承到可执行程序中。
优点:
​ 程序运行的时候与静态库毫无瓜葛,方便移植。
缺点:
​ 浪费磁盘空间,以及内存空间。

2. 静态库的制作及使用

1)制作步骤
gcc编译: -ESc  	.iso
i)制作指令
​	$ gcc 	-c   mylib.c  	-o 	mylib.o  	完成预处理,编译,汇编;
​	$ ar 	-crs  	libmylib.a  	mylib.o 	生成静态库,库名为mylib
如果有多个.o文件结合成一个库
    $ ar 	-crs  	libmylib.a  	mylib1.o  mylib2.o
ii)静态库的命名规则
以lib开头,后面紧跟库名,以.a为拓展名
​	例子:libxxx.a 	xxx就是库的名字
2)静态库的使用
格式:
​		gcc    .c文件 	-o 	自定义可执行文件名 	-L库的路径 	-l库名
​		gcc 	main.c   -o 	main
​		-L的后面紧跟的是自定义库的路径
​		-l的后面紧跟的是自定义库的名字
例子
​gcc  main.c  -o  main 	-L./ -lmylib 生成一个main可执行二进制程序
gcc  main.c -lmylib 生成一个a.out可执行二进制程序
$ ar -t libmylib.a 
可以查看静态库中所包含的.o文件
例子:
$ ar -t libfunc.a
	func.o

【3】动态库

1.动态库的原理

动态库,把库函数的链接推迟到程序运行的时候。
当程序执行到库函数时,会去找动态库。如果内存中不存在该动态库,则会将动态库加载到内存中。
如果内存中已经存在该动态库,则会直接调用库函数。
优点:
​可执行程序运行的时候,节省内存空间。可执行程序存储的时候,节省磁盘空间。
缺点:
​程序运行的时候,如果没有找到动态库,会导致程序崩溃。

2.动态库的制作

1)制作步骤
i)制作指令
$ gcc 	-fPIC	-Wall 	-c 	mylib.c 	-o 	mylib.o
​$ gcc 	-shared  -o  libmylib.so  mylib.o //生成一个名字为 mylib 的动态库
​如果有多个.o文件结合成一个库
​$ gcc  -shared  -o 	libmylib.so  mylib1.o  mylib2.o 

ii)动态库的命名规则
​	以lib开头,后面紧跟库名,以.so为拓展名
​	例子:libxxx.so 	xxx就是库的名字
2)动态库的使用
格式:
​		gcc    .c文件 	-o 	自定义可执行文件名 	-L库的路径 	-l库名
​		gcc 	main.c   -o 	main
​		-L的后面紧跟的是自定义库的路径
​		-l的后面紧跟的是自定义库的名字
例子
​gcc  main.c  -o  main  -L./  -lmylib  生成一个main可执行二进制程序
​gcc  main.c  -lmylib  生成一个a.out可执行二进制程序
$ ldd main
	linux-gate.so.1 =>  (0xb7793000)
	libfuncso.so => not found
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75cd000)
	/lib/ld-linux.so.2 (0xb7794000)
3)调用自定义动态库
1.把库拷贝到 /usr/lib或者/ lib下
$ sudo mv libfuncso.so /usr/lib/
/usr/lib 	一般存放的是,用户自己写的库
/lib 		系统提供的库
2.在LD_LIBRARY_PATH这个环境变量中,加上库所在的路径
例子
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/mydir/6_DC20101/3_lib
​注意:只在当前终端有效
3.在/etc/ld.so.conf.d/目录下创建一个以 .conf为拓展名的文件.
将动态库所在位置的绝对路径添加到.conf文件中。
​	执行ldconfig刷新。
​	1)$cd 	/etc/ld.so.conf.d/
​	2)$sudo  touch 	my.conf
​	3)$ sudo  vim  my.conf
​	4)填入动态库的绝对路径,注意:每一行只能写一个动态库的路径
​	5)保存退出
​	6)$sudo ldconfig

【4】总结

1.静态库

1)以libxxx.a命名
​2)在可执行程序编译的时候,直接将静态库结成到可执行程序中,因此可执行程序比较大。
​3)可执行程序在运行的时候占内存比较大。存储的时候,占磁盘空间比较多。
​4)给程序更新部署带来麻烦
​5)编译后的可执行程序,脱离静态库后不受影响

2.动态库

​1)以libxxx.so命名
​2)在可执行程序编译的时候,不会链接动态库,而是在程序执行的时候,将动态库加载到内存中。
​因此,可执行程序比较小。
3)占用内存和磁盘空间比较少
4)程序更新部署比较方便
5)编译后的可执行程序,脱离动态库后,会崩溃
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38717634/article/details/111872930

智能推荐

WPF自学—模仿QQ窗体载入和关闭动画_wpf 流动动画 防qq-程序员宅基地

文章浏览阅读2.6k次。这两天把《WPF编程宝典》这本书的动画相关章节看完了,于是想写个小程序练练手,但是不知道写什么好。看书的时候虽然也把上面的案例照着敲了一遍,但是它们毕竟和实际应用有很大差别,想用到日常项目里也不知道从何下手。刚好看到了一位网友 youngytj 分享的模仿QQ载入和关闭动画的文章,我就跟着学习模仿了一遍,下面来讲讲具体如何实现的。首先分析下我想实现的效果:第一,我打开程序后它从上到下滚动_wpf 流动动画 防qq

Facebook 详解 -程序员宅基地

文章浏览阅读1.4k次。 Facebook 详解 译者:本文译自英文维基百科条目“Facebook”。只翻译了个人觉得对中国互联网从业者有价值的部分。比如有关Facebook相关的法律纠纷,就略去了。中文维基百科只完成了原文2%的翻译。如中文维基百科的志愿者们愿意,请随意使用本文的全部或部分内容充实中文维基百科的相关条目。其他转载,必须遵照维基百科的相关协议,并链接到本文和译言首页。谢谢。Faceboo

HDU 1595-程序员宅基地

文章浏览阅读519次。find the longest of the shortestTime Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1258 Accepted Submission(s): 445Problem Descripti_hdu 1595

基尔霍夫矩阵(求最小生成树)_基尔霍夫指数和邻接矩阵计算-程序员宅基地

文章浏览阅读238次。条件:给定一个右n个节点的简单图G(无重边、无自环、无向图),它的基尔霍夫矩阵Q(Q=D-A),Q*(去掉任意一行一列)的行列式(绝对值)即为图G的生成树个数度矩阵Dn*nd(i,j)=deg(vi)--节点i的边数 i==j 否则d(i,j)=0邻接矩阵An*nA(i,j)=1--vi与vj有边相连 否则A(i,j)=0..._基尔霍夫指数和邻接矩阵计算

android系统性能优化工具,十条Android系统优化技巧, 让手机更流畅-程序员宅基地

文章浏览阅读3.3k次。1、系统刷机升级到Android4.1或更新的系统,Android4.1系统已经有了质的飞跃,如果官方没有可升级的升级刷机ROM,可考虑刷第三方ROM,部分第三方ROM比官方ROM做的好很多,笔者测试用的三星i9000,刷不同的ROM开机时间相差一半。提示:刷机有一定风险,行货手机刷机后厂商就不提供保修,另外不是每款手机都可以刷机。刷机大师ROM基地提供多个品牌ROM下载,同时支持超多机型一键刷机..._安卓系统优化

不报辅导班一次性通过CISSP经验分享(文末附免费通关学习笔记)-程序员宅基地

文章浏览阅读568次,点赞5次,收藏11次。CISSP(Certified Information Systems Security Professional,注册信息系统安全专家)是一种国际认可的信息安全管理专业认证。CISSP认证由国际信息系统安全认证联盟(ISC)²提供,是全球范围内最受尊敬的信息安全专业认证之一。CISSP认证涵盖了信息安全的多个领域,包括安全和风险管理、资产安全、安全工程、通信与网络安全、身份和访问管理、安全评估与测试、安全运营。要获得CISSP认证,考生需要通过CISSP考试。_不报辅导班一次性通过cissp经验分享

随便推点

BUG_ON_bug_on(blk_queued_rq(req));-程序员宅基地

文章浏览阅读595次。调试的时候很有用的东西:dump_stack 使用前,先在内核配置中把kernel debug选上:make menuconfig:kernel hacking-->kernel debug 作用:一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。当被调用的时候,它们会引发oops,导致栈的回溯和错误信息_bug_on(blk_queued_rq(req));

基于微信汽车维修保养小程序毕业设计作品成品(2)后台管理系统-程序员宅基地

文章浏览阅读219次。本课题主要目标是设计并能够实现一个基于微信汽车维修保养小程序系统,前台用户使用小程序,小程序使用微信开发者工具开发;后台管理使用基PP+MySql的B/S架构,开发工具使用phpstorm;通过后台录入汽修店信息,录入维修和保养信息,用户通过小程序登录,查看汽修店信息,收藏汽修店,预约维修保养,发起评论等。

Zookeeper与ApacheCurator-程序员宅基地

文章浏览阅读777次,点赞27次,收藏23次。1.背景介绍1. 背景介绍Apache Zookeeper 和 Apache Curator 都是分布式系统中的一种集中式管理服务,用于实现分布式应用的一些基本功能,如集中配置管理、分布式同步、集群管理等。Apache Zookeeper 是一个开源的分布式应用程序,它提供了一种可靠的、高性能的分布式协同服务。Apache Curator 是一个基于 Zookeeper 的客户端库,它提供...

分布式事务与SpringCloud的集成-程序员宅基地

文章浏览阅读860次,点赞16次,收藏21次。1.背景介绍在分布式系统中,事务是一种用于保证数据的一致性和完整性的机制。分布式事务是指在多个不同的节点上执行的事务,这些节点之间需要协同工作以确保事务的一致性。SpringCloud是一个用于构建微服务架构的开源框架,它提供了一系列的组件来简化分布式事务的处理。1. 背景介绍分布式事务是一个复杂的问题,它涉及到多个节点之间的通信和协同。在传统的单机环境中,事务通常由数据库来处理,数据...

Linux重启网卡报错Device eth0 does not seem to be present_device ens5f0 does not seem to be prevent-程序员宅基地

文章浏览阅读5k次。Centos6.8重启网卡报错Device eth0 does not seem to be present虚拟机安装Centos系统以后,导出镜像,然后倒入镜像,修改IP后发现网卡启动失败:# service network restartShutting down loopback insterface: _device ens5f0 does not seem to be prevent

如何使用 API 网关实现 API 请求签名和验证-程序员宅基地

文章浏览阅读917次,点赞22次,收藏22次。1.背景介绍API 网关是一种在云计算中广泛使用的架构模式,它作为应用程序和服务之间的中介,负责接收来自客户端的请求并将其转发给后端服务。API 网关通常负责实现 API 请求的签名和验证,以确保请求的安全性和有效性。在本文中,我们将讨论如何使用 API 网关实现 API 请求签名和验证,以及相关的核心概念、算法原理、代码实例和未来发展趋势。2.核心概念与联系2.1 API 网关A..._网关做appid验签的目的是