静态库(.a):
程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库;
动态库(.so):
程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码;
·一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码;
·在可执行文件开始运行前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接;
·动态库可以在多个程序间共享,故动态链接使得可执行文件更小,节省了磁盘空间。
生成静态库的目的:
解决给客户一堆 .o 文件的问题。
以下是生成静态库要用到的测试文件:
add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif //__ADD_H__
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_H__
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(%d,%d)=%d\n",a,b,add(a,b));
a = 100;
b = 20;
printf("sub(%d,%d)=%d\n",a,b,sub(a,b));
return 0;
}
将测试文件写完后 ,按照以下的步骤即可生成静态库:
接着,我们链接静态库,编译main.c,结果如下:
最后,我们保留生成的测试目标文件,删掉静态库,看程序是否可以运行:
结果证明:测试目标文件生成后,静态库删掉,程序照样可以运行。
生成动态库的目的:
解决同样的代码在物理内存上存储多份的问题。
生成动态库要用的测试文件同上;
按照以下步骤即可生成动态库:
fPIC:产生位置无关码;
shared:表示生产共享库格式
库名规则:libxxx.so
运行动态库:
<1>、拷贝.so文件 到系统的共享库路径下,一般为 /lib;
<2>、更改LD_LIBRARY_PATH;
完成以上两步后,链接动态库,编译main.c,结果如下: