静态和动态的比较
公共函数制成函数库
函数库是编译时完成的,链接成一个可执行文件。程序运行时,不用用到函数库,因为需要的函数已经拷到相应文件下。—–静态库(xxx.a)
把对一些库函数的链接载入推迟到程序运行的时期—–动态链接库(xxx.so)
区别 | 静态库 | 动态库 |
---|---|---|
编译阶段 | 需要的代码连接进可执行程序 | 需要函数时,函数映射找到函数调入堆栈执行 |
可执行文件大小 | 大 | 小(要附带动态库) |
效率 | 较快 | 慢 |
动态库优点(c库采用动态库)
- 进程之间资源共享(调用一个函数会先查看所有正在运行的程序,看内存是否有此函数的拷贝,有的话就共享此拷贝,没有才链接。可以节省内存)
- 程序升级简单(只需升级动态库,无需重新编译链接)
- 由程序员决定需求链接,高效
创建三个文件
/*main.c*/
#include <stdio.h>
#include "my.h"
int main()
{
func();
return 0;
}
/*my.h*/
#include <stdio.h>
#include "my.h"
int main()
{
func();
return 0;
}
/*my.c*/
#include <stdio.h>
#include "my.h"
void func()
{
printf("111111111111111");
}
//静态库.a(编译时,一次编译,永久执行)
1.gcc -c my.c -o my.o
2.ar rcs libmy.a my.o
3.静态库编译:#gcc main.c -lmy -L.(.表示当前目录查找静态库)
//动态库.so(运行时,运行时才会找库)
1.gcc -c my.c -o my.o
2.gcc –shared –fPIC my.o –o libmy.so
3.gcc test.c -lmy -L.
4../out