静态库和动态库的区别: 静态库(xxx.a):GCC在编译生成可执行程序时,从静态库中提取必要的目标文件,在可执行程序编译成功时,同时包含了目标文件,这样带来的缺点是当多个可执行程序同时调用一个库文件时,加载到内存中的库文件可能存在重复,这是对内存的一个极大的浪费,但是由于编译时已经把库文件中需要的目标程序拷贝过来,因此可执行程序初次加载的速度是比动态库略显快些。 动态库(xxxx.so):GCC在编译生成执行程序时,拷贝到可执行程序中的仅仅是一个库的地址(可以理解为指针),这样当多个可执行程序利用同一个动态库时,加载到内存中的库文件仅仅需要一份就可以了,这样大大的保护的珍贵的内存资源,略为不足的是当执行可执行文件时,需要通过地址寻找动态库文件,这个过程耗费了些许的时间。
下边是一个静态库创建使用的实例:
[root@localhost ~]# cd /gcc/ar/ [root@localhost ar]# mkdir include [root@localhost ar]# mkdir lib 建立头文件:mylib.h [root@localhost ar]# vim include/mylib.h
int func1(int x,int y);
void func2(int x); 建立以下的源文件:main.c、func1.c、func2.c [root@localhost ar]# vim main.c
#include <stdio.h> #include "mylib.h"
int main(void) { int i; i = func1(1,2); func2(i); return 0; } ~ [root@localhost ar]# vim func1.c
#include "mylib.h"
int func1(int x,int y) { return(x+y); } ~ [root@localhost ar]# vim func2.c
#include <stdio.h> #include "mylib.h"
void func2(int x) { printf("The result is %d\n",x); } ~ 生成目标文件 [root@localhost ar]# gcc -Wall -O -c func1.c –Linclude [root@localhost ar]# gcc -Wall -O -c func2.c –Iinclude [root@localhost ar]# gcc -Wall -O -c main.c –Iinclude 生成库文件 [root@localhost ar]#cd lib/ [root@localhost lib]# ar cr libethnicity.a ../func1.o ../func2.o [root@localhost lib]# ar t libethnicity.a func1.o func2.o 编译生成可执行文件(这里采用三种方式) 1)采用-L library ,-I include方式 [root@localhost ar]# gcc -Wall -O main.o -Llib -lethnicity -o wanyan [root@localhost ar]# ./wanyan The result is 3 2)采用添加到系统库的方式 [root@localhost ar]# cp lib/libethnicity.a /usr/lib [root@localhost ar]# gcc -Wall -O main.o -lethnicity -o ethnicitybeta [root@localhost ar]# ./ethnicitybeta The result is 3 3)修改本地.bash_profile的方式 [root@localhost ar]# export LIBRARY_PATH=/gcc/ar/lib:$LIBRARY_PATH [root@localhost ar]# gcc -Wall -O main.o -lethnicity -o laji [root@localhost ar]# ./laji The result is 3 实验结束 |