一.动态库和静态库的定义
1.静态库
程序在编译链接时把库的代码链接到可执行文件中。程序运行时就不再需要静态库
2.动态库
程序在运行的时候才去链接动态库的代码,多个程序 共享使用代码
3.动态链接
在执行文件之前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程就叫做动态链接。其中动态库可以在多个程序间共享,使用动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程公用,节省了内存和磁盘空间。
二.如何生成一个静态库
1.先来看一组代码
//add.c
#include<stdio.h>
#include"add.h"int add(int a, int b)
{return a + b;
}
//add.h
#ifndef __ADD_H__
#define __ADD_H__int add(int a ,int b);#endif //__ADD_H__#ifndef __ADD_H__
#define __ADD_H__int add(int a ,int b);#endif //__ADD_H__
//sub.c
#include<stdio.h>
#include"sub.h"int sub(int a, int b)
{return a - b;
}
//sub.h
#ifndef __SUB_H__
#define __SUB_H__int sub(int a ,int b);#endif //__SUB_H__
//main.c
#include<stdio.h>
#include"add.h"
#include"sub.h"int main()
{int a = 10;int b = 30;printf("add(%d, %d) = %d\n", a, b, add(a, b));printf("sub(%d, %d) = %d\n", a, b, sub(a, b));return 0;
}
经过编译生成.o文件
通过ar(gnu)归档文具,rc表示代替和创建)生成静态库
其中ar后的-ty中t代表列出静态库的文件,v代表详细信息
运行静态库:
此时将静态库删掉,程序照样可以执行
注意:-L选项是指定库的路径(这里是当前目录所在路径),-l是指定库名(这里是mymath),静态库是以.a结尾,在使用ar -rc 命令中应该注意以下几点
三.如何生成一个静态库
1.生成动态库
2.运行动态库
3.使用外部库
//test.c 文件
#include<stdio.h>
#include<math.h>int main()
{double x = pow(2.0, 3.0);printf("The cubed is %f\n", x);return 0;
}