一. 静态库
静态库(.a):程序在编译链接时候把库的代码链接到可执行代码中,程序运行时将不再需要静态库。
静态链接:即在链接阶段,将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件。通常具有内存扩大,但具有可移植性。
测试程序:
add.h
#ifndef _ADD_H_
#define _ADD_H_
int add(int x,int y);
#endif
add.c
#include "add.h"
int add(int x,int y){
return x+y;
}
sub.h
#ifndef _SUB_H_
#define _SUB_H_
int sub(int x,int y);
#endif
sub.c
#include "sub.h"
int sub(int x,int y){
return x-y;
}
mul.h
#ifndef _MUL_H_
#define _MUL_H_
int mul(int x,int y);
#endif
mul.c
#include "mul.h"
int mul(int x,int y){
return x*y;
}
div.h
#ifndef _DIV_H_
#define _DIV_H_
int div(int x,int y);
#endif
div.c
#include "div.h"
int div(int x,int y){
return x/y;
}
main.c
#include<stdio.h>
#include "add.h"
#include "sub.h"
#include "mul.h"
#include "div.h"
int main(){
int x = 10;
int y = 5;
printf("add(10,5) = %d\n",add(x,y));
printf("sub(10,5) = %d\n",sub(x,y));
printf("mul(10,5) = %d\n",mul(x,y));
printf("div(10,5) = %d\n",div(x,y));
}
在一个目录下,创建多个文件,代码及命名如上所示。
然后编译add.c sub.c mul.c及div.c,生成add.o sub.o mul.o及div.o:
生成静态库:
( ar是gnu归档工具,rc表示replace and create。)
查看静态库中的目录列表:
( t:列出静态库中的文件;v:verbose 详细信息)
( -L:指定库路径;-l:指定库名)
测试目标文件生成后,静态库删掉,程序照样可以运行。
二. 动态库
动态库(.so):程序在运行时才去链接动态库的代码,多个程序可共享使用库的代码。
动态链接:l动态链接所调用的库函数代码并没有拷贝到程序的可执行文件中。它仅仅在exe文件中加入了调用的函数所在库文件和调用函数在文件中的位置等信息链接进目标程序,仅当应用程序被装入内存开始运行时,才从库中寻找相应函数代码,因此需要相应动态库文件的支持。
将上面的测试程序拷贝一份至另外一个目录,用来生成动态库:
类似于静态库,输入如下命令:
( shared:生成共享库格式;fPIC:产生位置无关码;库名规则:libxxx.so)
此时执行a.out出错。
这里我们可以用以下方法解决:
首先将该动态库文件拷贝至系统共享库路径下,一般指/usr/lib下。
更改LD_LIBRARY_PATH:
此时运行就成功了。
再用ldd命令:记录应用程序所依赖的动态库。