库的制作---函数库

1>什么是库?

			本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和
			linux的本质不同,因此二者库的二进制是不兼容的。

2>库的分类

			linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代码被载入的时刻不同。

3>静态库和共享库的区别

			静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。
			
			动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此在程序运行
			时还需要动态库存在,因此代码体积较小。

4>库存在的意义

			库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守
			许可协议。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开
			始,因此库的存在意义非同寻常。
			
			共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有
			一份该共享库的实例

5>许可协议

				1>对源代码进行屏蔽
				2>尊重开发者的知识产权
				3>使用时比较方便
				4>如果你自己编译好了库要共享,建议不要把库的本体共享,而是建立链接,并修改权限
					对库进行保护。

6>静态库的制作:

					1>静态库
					静态库对函数库的链接是放在编译时期(compile time)完成的。
					gcc的四大步骤:预处理---编译---汇编---链接
							hello.c-hello.i-hello.s-hello.o---hello(a.out)
							
					优点:程序在运行时与函数库再无瓜葛,移植方便
					
					缺点:浪费空间和资源,因为所有相关的对象文件(object file)与牵涉到的函数
					库(library)被链接合成一个可执行文件(executable file)
					
					2>静态库如何制作?
						1>创建一个库源文件:mylib.c
						int myplus(int a,int b)
						{
							return a+b;
							
						}
						int myusb(int a,int b)
						{
							return a-b;
							
						}
						
						
						
						2>将库源文件编译成.o目标文件
						gcc -c mylib.c -o mylib.o
						
						
						3>将.o文件制作成静态库文件---//静态库命名必须是:lib库名.a
						ar crs libmylib.a mylib.o
						
						4>编写一个测试代码
							#include <stdio.h>
							#include "mylib.h"
							int main(void)
							{
								int a,b;
								printf("请输入a和b");
								scanf("%d%d",&a,&b);

								printf("%d + %d = %d\n",a,b,myplus(a,b));
								
								printf("%d - %d = %d\n",a,b,myusb(a,b));
								return 0;
							}

						
						
						
						5>编译test.c同时链接制作的静态库
							gcc -Wall -o test test.c -L. -lmylib			//-L.库的路径	-l库名
					
						6>运行:./test

7>动态库的制作

					1>动态库的特点
						动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)。 
						可以实现进程之间的资源共享。
						将一些程序升级变得简单。
						甚至可以真正做到链接载入完全由程序员在程序代码中控制。
						
					2>如何创建一个动态库
							//动态库的命名形式为:lib库名.so
							1>创建一个库源文件:mylib
								int myplus(int a,int b)
								{
									return a+b;
									
								}
								int myusb(int a,int b)
								{
									return a-b;
									
								}
							2>将库源文件编译成.o的目标文件
							gcc -fPIC -Wall -c mylib.c     //-fPIC创建与地址无关的编译程序
							
							
							3>将.o文件制作成动态库文件
							gcc -shared -fPIC -o libmylib.so mylib.o
							
							4>编写一个测试代码:test.c
								#include <stdio.h>
								#include "mylib.h"
								int main(void)
								{
									int a,b;
									printf("请输入a和b");
									scanf("%d%d",&a,&b);

									printf("%d + %d = %d\n",a,b,myplus(a,b));
									
									printf("%d - %d = %d\n",a,b,myusb(a,b));
									return 0;
								}
									
							
							5>编译test.c的同时链接制作的动态库
								gcc -Wall -o test1 test.c -L. -lmylib
							
							6>将动态库加载进系统中---让系统找到它
								三种方法:
								1>方法一:直接将动态库拷贝到 /lib或 /usr/lib
								
								2>方法二:将动态库所在路径加入配置文件:/etc/ld.so.conf 
								操作步骤:
										1>sudo vim /etc/ld.so.conf
										在下面添加一行
										/home/peter/shared/IO/day3/autolib
										
										2>wq退出后执行:
											sudo ldconfig
											
											
								3>方法三(不推荐):
										将动态库所在路径加入到环境变量中
										执行命令:
				export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/peter/shared/IO/day3/autolib
				
							7>运行:
								./test1
							
						
					动态库升级:
						1>修改动态库的源代码
						#include <stdio.h>
						int myplus(int a,int b)
						{
							printf("食不食油饼\n");
							return a+b;
						}
						int myusb(int a,int b)
						{
							printf("你让我怎么荔枝\n");
							return a-b;
						}
						2>重新制作动态库
						gcc -fPIC -Wall -c mylib.c
						gcc -shared -fPIC -o libmylib.so mylib.o
						
						3>./test1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值