库
库分为静态库和动态库。 二者的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
库文件
库文件:存放函数的变量的仓库
特点:只能使用库里的函数和变量,不能看到其实现
库文件的存放路径:/lib/usr/lib
静态库与动态库
- | 后缀 | - |
---|---|---|
静态库 | .a | 当使用静态库时,库里的函数和变量是在编译时加载到可执行文件的 |
动态库 | ,so | 当使用动态库时,库里的函数和变量是在运行时加载到可执行文件的 |
比较的方面 | 静态库 | 动态库 |
---|---|---|
代码装载速度快 | √ | - |
执行速度快 | √ | - |
使用效率高 | √ | - |
节省内存并减少页面交换 | - | √ |
可维护性和可扩展性高 | - | √ |
开发过程独立,耦合度小 | - | √ |
适用于大规模软件开发 | - | √ |
//己方比较出的优点即为对方缺点
静态库与动态库的制作
静态库制作
- gcc -c 源文件
- ar rcs 库文件名字 ,目标文件
- gcc 源文件 -l库名 -L库的路径
动态库制作
- gcc -shared -fPLC 源文件 -o 库名
- gcc 源文件 ./库名 -o 可执行文件
示例
测试代码
main.c:
#include"stdio.h"
#include"main.h"
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d+%d=%d\n",a,b,add(a,b));
printf("%d-%d=%d\n",a,b,sub(a,b));
printf("%d*%d=%d\n",a,b,mul(a,b));
if(b==0)
printf("div error\n");
else
printf("%d/%d=%d\n",a,b,div(a,b));
return 0;
}
main.h:
extern int add(int,int);
extern int sub(int,int);
extern int mul(int,int);
extern int div(int,int);
cal.c
cal.c
#include"stdio.h"
#include"main.h"
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int div(int a,int b)
{
return a/b;
}
静态库制作测试
测试开始前
步骤1.
gcc -c cal.c//将代码文件编译成目标文件.o
效果:
步骤2.
ar rcs libcal.a cal.o//通过ar工具将目标文件打包成.a静态库文件
效果:
步骤3.
gcc main.c -L. -lcal -o main//生成可执行文件
效果:
试一下可执行文件的运行:
动态库制作测试
测试开始前
步骤1.
gcc cal.c -shared -fPIC -o libcal.so//把.c文件编译成.o文件,再把.o文件编译生成libcal.so文件
步骤2.
gcc main.c ./libcal.so -o main //编译命令
测试一下运行: