一、库
库是已经写好的成熟的可以供人们复用的代码。操作系统暴露了自己的部分接口供我们使用,但是由于接口太复杂,有心的
开发者就将这些系统调用接口进行了二次封装形成了库,这对于我们小白来说方便了很多。
二、静态库
1.什么是静态库?
程序在链接的时候把汇编生成的二进制目标文件(.o)与库的代码一起链接打包到可执行文件中,程序运行的时候将不再需要静态库 。这样的链接方式叫做静态链接。
既然静态库是和汇编生成的.o文件一起链接到可执行文件中,那么静态库或许也是.o文件?事实正是如此,静态库是很多目标文件的组合。
2.如何使用静态库?
举一个加减法的例子:
add.h代码:
#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif
add.c代码:
#include"add.h"
int add(int a,int b)
{
return a+b;
}
sub.h代码:
#ifndef __SUB_H__
#define __SUB_H__
int sub(int a,int b);
#endif
sub.c代码:
#include"sub.h"
int sub(int a,int b)
{
return a-b;
}
main.c代码:
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main()
{
int a=10;
int b=20;
printf("add(10,20)=%d\n",add(a,b));
printf("sub(10,20)=%d\n",sub(a,b));
return 0;
}
●创建静态库:
1>将代码编译成目标文件.o。(注意要带参数-c)
2>通过ar归档工具打包成.a静态库文件。
●使用静态库
Linux下使用静态库,只需要在编译时指定库的搜索路径和库的名称。
-L:指定的搜索路径。
-l:指定链接的时候需要的静态库,编译器查找库时具有隐含的命名规则,会自动在这个名字前面加上lib,后面加上.a或.so。
3.静态库的特点?
1.测试目标文件生成后,静态库删掉,程序照样可以运行。
2.对库的链接在编译时期就已经完成,运行时和库就没有关系,因此静态库移植比较方便。
3.所有的目标文件与库被链接成一个可执行文件,浪费空间。
三、动态库(.so)
1.什么是动态库?
程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个 过程称为动态链接。
2.如何使用?
同样是上面的例子生成动态库:
●创建动态库
1>fPIC:产生位置无关码
2>shared: 表示生成共享库格式
●使用动态库
跟静态库一样使用,居然出错了,怎么肥事??这是由于系统根本找不到库文件。那么要怎么做:
1>拷贝.so文件到系统共享库路径下, 一般指/usr/lib
2>更改 LD_LIBRARY_PATH。
3>ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新。
3.动态库的特点?
1>将库函数的链接载入推迟到程序运行时。
2>动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚 拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
3>程序更新相比静态库简单。如果静态库更新了,那么它的所有应用程序都要更新,但动态库不用。
跟静态库一样使用,居然出错了,怎么肥事??