言之者无罪,闻之者足以戒。 ——《诗序》
LInux操作系统支持的函数库:
1、静态库,后缀名:libxxx.a,在编译时就将库编译进可执行程序中。
优点:程序的运行环境中不需要外部的函数库。
缺点:可执行程序大
2、动态库,又称共享库,libxxx.so,在编译的时候不加载到可执行程序中,只在运行的时候才将库加载到可执行程序中。
优点:可执行程序小
缺点:程序的运行环境中必须提供相应的库
函数库目录:/lib /usr/lib
静态库的制作:
1)、生成目标文件:gcc -c -o file.o file.c
2)、静态函数库创建命令 ar
ar -cr -o libfile.a file.o
-c : create 的意思
-r : replace 的意思,表示当插入的模块file.o已经存在 libfile.a 中,则覆盖。反之ar 显示一个错误消息
操作静态库的实例:
情况1、如果从别处得到一个静态库libunknown.a,想知道其中包含哪些模块?
命令:ar -t libunknown.a
静态库的编译:gcc -o main main.c -L. -lfile 编译main.c 就会把静态函数库整合进main。
其中:-L 指定静态函数库的位置供查找,注意L后面还有‘.’,表示静态函数库在本目录下查找
-l 则指定了静态函数库名,由于静态函数库的命名方式是libxxx.a,其中的ib和.a忽略
下面我们来看一下程序:
#include <stdio.h>
int main()
{
int ret;
int x,y;
x=10;
y=6;
ret=sub(x,y);
printf("ret=%d\n",ret);
return 0;
}
int sub(int x,int y)
{
return (x-y);
}
上面的程序是两个文件里面的内容:一个是main.c另一个是sub.c
动态库的制作:
1)、生成目标文件:gcc -c -o file.c
2)、gcc -shared -fpic -o libfile.so file.o
-fpic:产生的位置与代码无关
-shared:生成共享库
用上述命令生成libaddsub.so动态函数库
gcc -o main main.c -L. -lfile
此时还不能立即./main,因为在动态函数库使用时,会查找/usr/lib /lib目录下的动态函数库,而此时我们生成的库不在里边。
第一种方法:
linaddsub.so 放到/usr/lib或/lib中去。
第二种方法:
假设libfile.so在/hom/linux/file中;export LD_LIBRARY_PATH=/hom/linux/addsub: $LD_LIBRARY_PATH
第三种方法:
在/etc/ld.so.conf文件里面加入我们生成的库的目录,里面存放的是链接器和加载器搜索共享库时检查的目录,默认是从/usr/lib /lib
中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中并执行命令:ldcongfig /etc/ld.so.conf
到此为止静态函数库和动态函数库的制作就说完了,希望对你我都有一定的帮助。