动态库与静态库

一、Linux中的库文件

库文件其实是一个二进制文件,在这个二进制文件中,不能包含main函数。
库文件可以保护用户的代码实现,也不影响其他的用户使用。
就是将库文件发送给客户,而不把.c文件发送给对方。
库文件分为静态库和动态库。

在Windows中库的格式:
静态库:xxx.lib
动态库:xxx.dll
//----------------------------------------------------------------------------------------
在linux中库的格式:
静态库:libxxx.a    【其中xxx为库名,就比如libc.a  c就是库命 】
动态库:libxxx.so     【其中xxx为库名,就比如libc.so  c就是库命 】

实际开发中,两者都有使用,不过动态库的使用比静态库多。

二、 静态库

1、静态库的特点

静态库格式为:libxx.a 是一个二进制文件。
如果用户想要使用这个库,就要将自己的库文件和.c文件编译生成一个可执行文件(将库函数放在可执行文件中),
所以静态库生成的可执行文件体积较大,但是效率较高,因为不依赖于libxx.a库文件,直接就可以执行可执行文件,更新比较麻烦。

2、静态库的制作

gcc -c add.c -o add.o     //只编译不链接
ar -cr libadd.a add.o       
#依赖于add.o生成libadd.a静态库  其中libadd.a中的add是库名(add可以随意)

其中:ar :制作静态库的命令
  	 -c :创建静态库
  	 -r :将库文件放在系统的库目录中

在这里插入图片描述

之后将.h文件移动到inc文件夹,将.c文件(除了main.c文件)移除,发给客户。

3、静态库的使用

gcc main.c -L ../lib -l add

其中:
-L :指定编译生成可执行文件需要的库的路径,例子中后面跟的 ../lib 就是库文件所在的路径
-l :链接编译所使用的库 库的名字 (小写的L)(其中libadd.a中的add是库名(add可以随意))
-I :指定头文件的路径 (有.h文件就要指定路径)

三、动态库

1、动态库的特点

动态库格式:libiadd.so 是一个二进制文件
动态库生成的可执行文件体积较小,效率较低(只是相对于静态库)其实效率还是挺高的。

2、动态库的制作

gcc -fPIC -shared add.c -o ../lib/libadd.so -I ../inc    
 // -I 为链接(库文件)头文件路径(同上面静态库使用参数的介绍),
 //如果链接上库文件的话,add.c里加上#include "add.h"就不会报错了
 
其中:-fPIC : 忽略文件位置    如果没加-I ../inc就不能包含add.h
  	 -shared:标识生成动态库
	 add.c :生成库所要依赖的.c文件
 	 ../lib/libadd.so:生成动态库,存放动态库的 路径及名字 
 	 				   这个意思就是,生成库文件放在上一级路径下,并命名为libadd.so

在这里插入图片描述
将.c文件删除,不删除main.c文件,根据使用方式,选择对动态库的移动。

3、动态库的使用

第一步.编译可执行程序依赖动态库

-L:指定库的路径
-l:链接使用的库
-I :指定头文件路径
gcc main.c -L ../lib/ -ladd -I ../inc/

第二步.执行可执行程序(指定库的路径)

方式1:将自己的库放在/lib(系统库文件)
		sudo mv libadd.so /lib
		./a.out
方式2:通过指令命令 指定库的路径(只在当前终端生效)
		export LD_LIBRARY_PATH=../lib/
		./a.out
方式3:通过修改库的配置文件让其生效sudo (修改环境变量,添加文件的路径)
		sudo vi /etc/ld.so.conf.d/libc.conf
		加上一行/mnt/......../lib (库的所在路径)
   	 	sudo ldconfig            (使配置文件重新生效)
		./a.out

四、静态库与动态库的区别

1、静态库:

1、libname.a格式命名

2、在程序编译时,直接将静态库拷贝到可执行程序中,因此可执行文件比较大

3、可执行程序脱离静态库后不受影响

4、静态库修改后,程序需要重新编译生成新的可执行文件 ​

2、动态库:

1、libname.so格式命名

2、可执行程序编译时,不会连接到动态库,而是在程序执行的时候,将动态库加载到内存中,内存中最多只有一份,可执行程序比较小

3、脱离动态库后,可执行程序会崩溃

4、动态库修改后,不需要重新编译程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好睡觉好好吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值