Linux操作系统支持的库函数分为:
静态库:libxxx.a,在编译时就将库编译进可执行程序中
优点:程序的运行环境中不需要外部的函数库
缺点:可执行程序大
动态库:又称共享库,libxxx.so,在运行时将库加载到可执行程序中
优点:可执行程序小
缺点:程序的运行环境中必须提供相应的库
库函数目录: /lib /usr/lib
一、静态库的制作
1. 生成目标文件: gcc -c file.c
2. 静态函数库创建命令:ar
ar -cr libfile.a file.o
-c create的意思
-r replace的意思,表示当插入的模块file.o已经存在于libfile.a中,则覆盖,反之ar显示一个错误消息
静态库操作的几个实例
情况1:如果从别处得到一个静态库libunkonwn.a,想知道其中包含哪些模块
命令:ar- t libunknown.a
静态库的编译:gcc -o main main.c -L. -lfile编译main.c就会把静态库函数整合进main
其中:
-L指定静态库函数的位置供查找,注意L后面还有’.’,表示静态函数库在本目录下查找
-l则指定了静态函数库名,由于静态函数库的命名方式是lib***.a,其中的lib和.a忽略
下面操作一波实际过程中静态库是如何制作的
1. main.c 2. --------------------------------------------------------------------------- 3. #include <stdio.h> 4. 5. itn main(void) 6. { 7. int ret; 8. int x = 10, y = 5; 9. ret = sub(x, y); 10. printf(“ret = %d\n”, ret); 11. 12. return 0; 13. } 14. 15. sub.c 16. -------------------------------------------------------------------------- 17. int sub(int x, int y) 18. { 19. return (x – y); 20. }
编译过程如下:
1. gcc -c -o sub.o sub.c //生成sub.o文件 2. ar -cr -o libsub.a sub.o //用上一步生成的sub.o文件生成libsub.a文件 3. gcc main.c -L. -lsub //将libsub.a静态库编译进main.c中
此时删除libsub.a之后,程序依然可以运行,是因为libsub.a已经编译进main程序中了
二、动态函数库的制作
1. 生成目标文件: gcc -c file.c
2. gcc -shared -fpic -o libfile.so file.o
-fpic:产生位置无关码
-shared:生成共享库
用上述命令生成libaddsub.so动态库函数
gcc -o out main.c -L. -lfile
此时还不能立即./a.out,因为在动态库函数使用时,会查找/usr/lib /lib目录下的动态库函数,而此时我们生成的库不在那个目录下,那么如何执行呢?
第一种方法:
将libaddrsub.so拷贝到/usr/lib或/lib中
第二种方法:假设libfile.so在/home/linux/file路径下
export LD_LIBRARY_PATH=/home/linux/file/addsub:$LD_LIBRARY_PATH
第三种方法:
在/etc/ld.so.conf文件里面加入我们生成的目录,然后/sbin/liconfig
/etc/ld.so.conf是非常重要的一个目录,里面存放的是连接器和加载器搜索共享库时的重要目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig
下面操作一波实际过程中静态库是如何制作的
1. main.c 2. --------------------------------------------------------------------------- 3. #include <stdio.h> 4. 5. itn main(void) 6. { 7. int ret; 8. int x = 10, y = 5; 9. ret = sub(x, y); 10. printf(“ret = %d\n”, ret); 11. 12. return 0; 13. } 14. 15. sub.c 16. -------------------------------------------------------------------------- 17. int sub(int x, int y) 18. { 19. return (x – y); 20. }
编译过程如下:
1. gcc -c -o sub.o sub.c //生成sub.o文件 2. gcc -shared -fpic -o libsub.so sub.o //用上一步生成的sub.o文件生成libsub.so文件 3. gcc main.c -L. -lsub
在用上面的方法将libsub.so导入到环境变量中,此时执行生成的可执行就可以看到执行结果了。