Linux中有两类函数库,分别是静态库和动态库。
静态函数库:
这类库的姓名一般是libxxx.a;运用静态函数库编译成的文件比较大,由于整个函数库的一切数据都会被整合进方针代码中,他的长处就清楚明了了,即编译后的履行程序不需求外部的函数库支撑,由于一切运用的函数都现已被编译进去了。当然这也会成为他的缺陷,由于假如静态函数库改动了,那么你的程序有必要从头编译。
动态函数库:
这类库的姓名一般是libxxx.so;相对于静态函数库,动态函数库在编译的时分并没有被编译进方针代码中,你的程序履行到相关函数时才调用该函数库里的相应函数,因而动态函数库所发生的可履行文件比较小。由于函数库没有被整合进你的程序,而是程序运转时动态的请求并调用,所以程序的运转环境中有必要供给相应的库。动态函数库的改动并不影响你的程序,所以动态函数库的晋级比较便利。
linux体系有几个重要的目录寄存相应的函数库,如/lib /usr/lib。
下面来介绍linux静态函数库的创立和运用:
例程str_out.h str_out.c main.c:
str_out.h
#ifndef STR_OUT_H
#define STR_OUT_H
void str_out(const char* str);
#endif
str_out.c
#include
#include str_out.h
void str_out(const char* str){
printf(%s\n,str);
}
main.c
int main()
{
str_out(hello world);
return 0;
}
不管是静态函数库仍是动态函数库,都是由*.o方针文件生成。
所以先gcc -c str_out.c
静态函数库由ar指令创立
本例:ar -cr libstr_out.a str_out.o
-c create的意思
-r replace的意思,表明当刺进的模块名现已在库中存在,则替换同名的模块。假如若干模块中有一个模块在库中不存在,ar显现一个过错音讯,并不替换其他同名模块。默许的情况下,新的成员添加在库的结尾处,能够运用其他任选项来改动添加的方位。
到此静态函数库创立结束。
运用办法:经过gcc -o out main.c -L. -lstr_out编译main.c就会把静态函数库整合进out。
其间
-L指定静态函数库的方位供查找,留意L后边还有’.’,表明静态函数库在本目录下查找。
-l则指定了静态函数库名,由于静态函数库的命名办法是lib***.a,其间的lib和.a疏忽。
依据静态函数库的特性,此处删去libstr_out.a后out仍然能够运转,由于静态库的内容现已整合进去了。
动态函数库的创立和运用
gcc -shared -fPCI -o out main.c -L. -lstr_out
用该指令生成libstr_out.so 动态函数库。
gcc -o out main.c
此刻还不能当即./out,由于在动态函数库运用时,会查找/usr/lib /lib目录下的动态函数库,而此刻咱们生成的库不在里边。
这个时分有好几种办法能够让他成功运转:
最直接最简略的办法便是把libstr_out.so拉到/usr/lib 或/lib中去。
还有一种办法 export LD_LIBRARY_PATH=$(pwd)
别的还能够在/etc/ld.so.conf文件里参加咱们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里边寄存的是链接器和加载器查找同享库时要查看的目录,默许是从/usr/lib /lib中读取的,所以想要顺畅运转,咱们也能够把咱们库的目录参加到这个文件中并履行/sbin/ldconfig
别的还有个文件需求了解/etc/ld.so.cache,里边保存了常用的动态函数库,且会先把他们加载到内存中,由于内存的拜访速度远远大于硬盘的拜访速度,这样能够进步软件加载动态函数库的速度了。