动态库和静态库

动态库和静态库

库是一种代码的二进制分装
在其他的源代码中,可以直接调用,但是你可能看不到
具体的代码(没有公开源代码)。把库文件看出一个代码
仓库,他可以提供一些变量、函数等。。

库分为静态库和动态库

1.动态库

动态库的使用步骤:
	(1)编辑源代码
		 xxx.c   功能函数的实现
		 xxx.h   函数以及数据类型的声明等  “文件接口”
		 。。。
		 。。。
	NOTE:一般来说 库的源代码 不能包含 main 函数  
	
	(2)将你所编辑的代码生成动态库
	(arm-linux-)gcc -shared -fpic -o libxxx.so xxx.c yyy.c ..
	把xxx.c yyy.c ...编译生成动态库 
	动态库的名字:libxxx.so  一定是lib开头 .so 结尾
	-shared:生成一个动态库(共享库)
	-fpic:与位置无关
	-o:output 指定生成动态库的名字,或输出的名字
	
	(3)把头文件和库拷贝给需要用的人
		main.c
			<-----  libxxx.so 
			<-----  xxx.h
			
	(arm-linux-)gcc main.c -o main 
	(Include) -I  接一个目录名 指定头文件的搜索路径
	可以接多个 -I
	
	(lib) -l 指定一个需要用到库的名字(除去前面的lib和
	后面的.so)  可以指定多个 -l 
	
	(Lib) -L  指定一个库的搜索路径  可以有多个-L
	
	eg:
	gcc main.c -o main -L ./sum -l sum -I ./sum 
	
	执行了上面命令生成了一个可执行文件main
	可执行文件main会使用到我们的libsum.so 这个库
	但是在生成main的时候 他并没有将库的内容直接拷贝
	到这个main里面去 只是在main里面做了一个标记,
	所以当我们直接去运行这个可执行文件的时候,
	他会报错  因为他首先就去查找所依赖的库
	
./main: error while loading shared libraries:
libsum.so: cannot open shared object file: No such file or directory

(4)运行时刻,需要把可执行文件的动态库要下载到目标板上
并且还要指定动态库的搜索路径。
Linux 系统有一个环境变量  LD_LIBRARY_PATH
	LD :  加载
	LIBRARY:库
	PATH:路径

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/cs2217/交叉开发/3.动态库和静态库/code/sum

2.静态库

​ 在使用静态库的时候,是把静态库的内容拷贝到可执行文件中去
​ 这样的话,就不需把静态库放到目标板。

	静态库的使用步骤:
		(1)编译源代码
			a.c / a.h 
			b.c / b.h
			.......
			
		(2)把各个源文件编译成一个.o 文件 
		
			a.c  ---> a.o   (arm-linux-) gcc -c a.c -o a.o
			b.c  ......................................
			c.c  ..................
			.....
			
		(3)用 ar 命令把所以的.o 文件 生成静态库
		
			ar -cvr libxxx.a a.o b.o ....
			把这些.o 文件 生成一个静态库: libxxx.a  
			静态库是以lib开头  .a结尾  
			
		(4)把头文件和库拷贝给需要用的人
		main.c
			<-----  libxxx.a 
			<-----  xxx.h
			
	(arm-linux-)gcc main.c -o main 
	(Include) -I  接一个目录名 指定头文件的搜索路径
	可以接多个 -I
	
	(lib) -l 指定一个需要用到库的名字(除去前面的lib和
	后面的.a)  可以指定多个 -l 
	
	(Lib) -L  指定一个库的搜索路径  可以有多个-L
	
	eg:
	gcc main.c -o main1 -L ./sum -l sum -I ./sum 
	编译完就生成一个main1可执行文件  那么这个可执行文件里面
	就包含静态库里面的内容  所以用到这个可执行文件的时候
	只需要直接运行即可

3.动态库和静态库的区别

​ 动态库和静态库都是二进制的分装形式

区别:
	对于动态库,编译可执行文件时,并没有把动态库的内容拷贝到可执行文件中去
	只是做了个标记,表面可执行文件需要用到某某动态库,这样的话,运行该执行
	文件的时候,需要把所用到的动态库跟可执行文件一起带走,并且配置环境变量
	
	对于静态库,编译可执行文件时,会把静态库的内容链接到可执行文件中去
	运行该可执行文件的时候,就不需要静态库了
	
动态库的两个明显的优势:
(1)运行时刻,动态库在内存中指拷贝一份 
		而静态库的话,则会有多个拷贝(看多少个程序在使用它)
		
(2)当接口,更新动态库的时候 不需要重新编译依赖该动态库的工程文件

	如果你是静态库 修改 则需要重新编译依赖该静态库的所有工程文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值