前言
本文讲解了静态函数库和动态函数库的制作,并且讲解了他们如何整合进可执行程序中的,并且讲解了他们的区别
一、LInux系统下的函数库
静态库:
libxxx.a 在编译时就将库编译进可执行程序中
优点:程序的运行环境中不需要外部的函数库
缺点:可执行程序大
动态库:
又称共享库,libxxx.so,在运行时将库加载到可执行程序中
优点:可执行程序小
缺点:程序的运行环境中必须提供相应的库
其中linux系统下,函数库的目录有:/lib /usr/lib
具体可以进入相应的目录查看
二、静态函数库
1.函数库的制作
代码如下(示例):
生成目标文件:
gcc -c file.c -o file.o (其中file是文件名)
静态函数库创建命令ar
ar -cr libfile.a file.o
-c:创建的意思
-r:替换的意思,表示当插入的模块file.o已经存在libfile.a中,则覆盖掉,若没有覆盖,则ar显示一个错误信息。
2.操作静态库的实例
(1)如果从别处得到一个静态库libunknown.a,想知道其中包含哪些模块,可以使用如下命令:
ar -t libunknown.a
(2)静态库的编译:
gcc -o main main.c -L. -lfile
这条命令在编译main.c就会把静态库整合进main
其中:
-L指定静态函数库的位置供查找,注意-L后面还有“.”,表示静态函数库在本目录下查找。
-l则指定了静态函数库的名字,由于静态函数库的命名方式是“libxxx.a”,其中“lib”和“.a”可以忽略,因此上述命令-l后面实际上是“libfile.a”这个静态函数库。
注意:删除libfile.a后main仍然可以运行,因为静态库的内容已经整合进去了。
三、动态函数库
1.函数库的制作
生成目标文件:
gcc -c file.c -o file.o
生成libaddsub.so动态函数库
gcc -shared -fpic -o libfile.so file.o
-fpic:产生位置无关代码
-shared:生成共享库
2.操作静态库的实例
将动态库整合入可执行文件:
gcc -o out main.c -L. -lfile
此时还不能立即./out,因为在动态函数库使用时,会查找/usr/lib或者/lib目录下面的动态函数库,而此时我们生成的库不在里边,有如下解决方法
方法一:
Libfile.so放到/usr/lib或者/lib中去
方法二:
假设libfile.so在/home/linux/file目录下,输入如下命令
Export LD_LIBRARY_PATH=/home/linux/file: $LD_LIBRARY_PATH
方法三:
在/etc/ld.so.conf文件里加入我们生成的库所在的目录
然后使用命令:
/sbin/ldconfig /etc/ld.so.conf
来更新我们的修改
注意:
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib或者/lib中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig命令来更新修改。
总结
文章讲解了静态和动态函数库的简单制作,希望帮助到大家