1.静态库
Linux
操作系统支持的函数库分为:
静态库,
libxxx.a
,
在编译时就将库编译进可执行程序中。
优点:
程序的运行环境中不需要外部的函数库
。
缺点:可执行程序大
2.动态库
又称共享库,
libxxx.so
,
在运行时将库加载到可执行程序中。
优点:可执行程序小。
缺点:
程序的运行环境中必须提供相应的库。
函数库目录:/lib /usr/lib。
3.静态库的创建
静态库的制作:
1.
生成目标文件:
gcc -c file.c .o
2.
静态函数库创建命令
ar
ar ‐cr 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
则指定了静态函数库名,由于静态函数库的命名方式是
lib***.a
,其中的
lib
和
.a
忽略。
删除
libaddsub.a
后
main
依然可以运行,因为静态库的内容已经整合进去了。
生成目标文件:
![](https://i-blog.csdnimg.cn/direct/83e2caefcd544376a3e0efd12d427ba0.png)
创建静态库:
![](https://i-blog.csdnimg.cn/direct/75d66332440a4c3c98aafe6190990c7e.png)
生成可执行文件:
![](https://i-blog.csdnimg.cn/direct/a043199935fb4b81a3f1702773adbe8f.png)
例子代码:
![](https://i-blog.csdnimg.cn/direct/3c903efe885f4d359d5b5f1787d1cc61.png)
4.动态库的创建
动态函数库的制作:
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
此时还不能立即
./out
,因为在动态函数库使用时,会查找
/usr/lib /lib
目录下的动态函数库,而此时我们生成的库
不在里边。
第一种方法:
libaddsub.so
放到
/usr/lib
或
/lib
中去。
生成sum.o目标文件:
![](https://i-blog.csdnimg.cn/direct/03d7181920c74ba3be5a00a1e9219c59.png)
创建动态库:
![](https://i-blog.csdnimg.cn/direct/172720096c6a41b9ab5f89676f25333d.png)
生成可执行文件:
![](https://i-blog.csdnimg.cn/direct/6cf69638cf63428daa9a9fe6bdbd85b1.png)
移动动态库到/user/lib:
![](https://i-blog.csdnimg.cn/direct/161d154bbecf41c8919595f3f5fdb84e.png)
第二种方法:
假设
libfile.so
在
/home/linux/file
环境变量方法
export LD_LIBRARY_PATH=/home/linux/addsub
:
$LD_LIBRARY_PATH
配置环境变量:
![](https://i-blog.csdnimg.cn/direct/df383ae40fee46b3ad7af2f13644ad45.png)
![](https://i-blog.csdnimg.cn/direct/188ad7f2ad874bb683a245170183a90b.png)
第三种方法:
在
/etc/ld.so.conf
文件里加入我们生成的库的目录,然后
/sbin/ldconfig
。
/etc/ld.so.conf
是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是
从
/usr/lib /lib
中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中并执行
/sbin/ldconfig
。
![](https://i-blog.csdnimg.cn/direct/e55ca33fb8c64a54a39fb292f41654d6.png)
![](https://i-blog.csdnimg.cn/direct/50f36ddcbfbb44f9a4434643c094c675.png)