静态库与动态库

1.什么是库?
库是一个二进制文件,库中包含的是一些编译好的代码,这些代码用来实现某些特定的功能,并且这些代码可以被程序调用;
2.库的分类
标准C库 数学库 线程库等
3.库是怎么得到的?
库是二进制文件,因为库中包含的是编译好的代码,所有二进制的代码都是通过源程序编译得到的,所以,库也有源码;
4.编写库的步骤
1> 编写库的源码
2> 编译生成二进制的形式
3> 程序中调用库中的函数
5.库的来源
1> 库有源码,可下载后编译(对库中代码比较感兴趣)
2> 直接安装二进制包(对库中代码不关心)
6.系统默认安装的库的路径:
/lib /usr/lib
7.库的作用
库是编译好的函数代码,可以复用的代码;

结论:
	库中包含的是让用户调用的一些函数,有了库,程序中不需要自己实现这些函数,直接调用库中的函数即可,节约开发时间,提高开发效率;

8.静态库的特点
编译(链接)时把静态库中相应的代码复制到可执行文件中,有以下两个特点:
1> 程序中已包含代码,运行时不再需要静态库
注意:
复制时,复制的是静态库中部分代码,即程序中调用了哪些函数,就会把这些函数的代码复制进来,而非整个库文件复制进来;
2> 程序运行时无需加载库,运行速度更快;

缺点:
	1> 占用更多的磁盘和内存空间
	2> 静态库升级后,程序需要重新编译链接

9.静态库的创建
1> 库名
以lib开始,以.a结束,.a表示静态库
一般库名代表库中函数的功能,比如:libc,代表c库,libm代表数学库等;
库中的目标文件可以是一个.o,也可以是多个.o
2> 静态库的创建
1)确定库中函数的功能,接口
2) 编写库的源码
3)编译库源码,生成二进制文件
4)写测试代码,调用库中代码
3>查看库中符号信息,即库中包含的函数名称
nm 库文件名
eg:
nm libcommon.a

1.共享库的特点
编译(链接)时仅记录用到哪个共享库的哪个符号(一般指函数名),不复制共享库中的代码;
1>程序不包含库中的代码 尺寸小;
2>多个程序可共用同一个库;
3> 程序运行时需要加载库;
4> 库升级方便,无需重新编译程序;

2.共享库的创建
1>确定库中函数的功能,接口
2>创建共享库文件
3>编写共享库源码
4>为共享库文件创建符号链接文件
5> 链接共享库文件

注意:
	-fPIC的作用:
		告诉编译器,生成与位置无关的代码;即生成的.o文件中的代码可以被加载到任意地址执行,而非只能在固定地址执行;
		原因:
			因为共享库的特点:可以被不同的程序加载到不同的地址执行,所以,库中的代码必须是与位置无关

3.运行时找不到库的原因:
因为程序运行时链接共享库,而没有复制共享库中的代码,所以,程序执行时,系统会加载程序中用到的共享库,加载时回去缺省
路径,比如:/lib /usr/lib 下找共享库,而共享库没有放在缺省路径下,所以会报错;

.1制作静态库
1.将头文件发布到/usr/local/include
sudo mv test.h /usr/local/include

	2.将库函数.c文件编译成.o文件
		gcc -c test.c -o test.o
		
	3.生成静态库
		ar -cr lib库名.a test.o
			//例如   ar -cr libstat.a test.o
			
	4.将库函数发布到/usr/local/lib
		sudo mv lib库名.a /usr/local/lib
		
	5.编译主函数的时候加上链接
		gcc main.c -l库名
		gcc main.c -L库的路径

.2制作动态库
1.将头文件发布到/usr/local/include
sudo mv test.h /usr/local/include

	2.将库函数.c文件编译成动态库文件
		gcc -shared -fpic test.c -o lib库名.so
		
	3.将库文件发布到/usr/local/lib
		sudo mv lib库名.so /usr/local/lib
		
	4.在/etc/ld.so.conf.d/libc.conf最后一行添加库文件的路径
		/usr/local/lib
		
	5.刷新配置文件
		sudo ldconfig
	
	6.gcc main.c -l库名

ldd 可执行程序 //查看当前程序所使用的动态库有哪些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值