1.函数库就是事先写好的函数的集合
2.作用:供程序员复用
3.函数库的提供形式有两种:
(1)动态链接库.so文件(效率相对于静态链接库更高,它本身不将库函数的代码段链接到可执行程序,只是做个标记,当程序执行时在去将这个库加载进内存中,并且在一次调用该库的时候直接加载到第一次执行的地方去执行,相当于静态库大大减小了内存的消耗)。
(2)静态链接库.a文件(是程序员只编译不连接形成.o的目标文件,然后用ar工具将.o文件归档成.a的归档文件(又叫静态链接库文件)是二进制的无法看到原文件,用户拿到.o和.h文件后,通过.h头文件得知库中库函数的原型,让后在.c文件中调用这些库函数)
4.gcc中默认是使用动态链接,要想静态链接在后面加-static来强制静态链接。
5.函数库的使用注意事项:
(1)包含相应的头文件;
(2)调用函数库时注意函数的原型;
(3)有些函数库调用时需要用-lxxx来指定链接;
(4)如果是动态库,要用-L指定动态库的地址。
6.制静态链接库制作与使用
(1)先编写库文件(.c和.h文件)这里叫aston.c和aston.h 。gcc -c 只编译不链接,生成.o的目标文件
gcc aston.c -o aston.o -c
(2)然后用ar工具进行打包生成.a归档文件,库名不能随意起,一般是lib+库名称
ar -rc libaston.a aston.o
(3)发布:发布时要发布.a文件和.h文件(把这两个文件发送给使用者)
(4)编写测试文件try.c,包含<stdio.h>和"aston.h"
(5)编译:-l链接这个库,-L.在当前目录下链接生成try这个可执行文件
gcc try.c -o test -laston -L.
7.动态链接库制作与使用
(1)编写库文件(.h 和.c文件)和静态库制作一样
(2)创建动态链接库:可以编写一个Makefile:(原理和一条一条执行一样,这里的-fPIC代表位置无关码)
all:
gcc aston.c -o aston.o -c -fPIC
gcc -o libaston.so aston.o -shared
(3)发布给使用者只需发布libxxx.so文件和xxx.h文件
(4)编译:这里用静态链接库编译的方式来编译不报错但生成的可执行文件会报错(因为动态链接库执行时需要加载,在执行try程序时,他发现它动态链接了libaston.so,于是它会去固定目录下尝试加载libaston.so,加载失败就报这个错误)
gcc try.c -o test -laston -L.
解决方法1:把libaston.so放到固定目录下,一般是、usr/lib目录
cp libaston.so /usr/lib
解决方法2:使用环境变量LD_LIBRARY_PATH,操作系统会先在这个环境变量里面找,然后再去/usr/lib下找,所以将libaston.so导入到这个环境变量下
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zzh/cteach/dynomic :后面是当前工作目录
相当于:export LD_LIBRARY_PATH="/home/zzh/cteach/dynomic"
双引号里面是当前工作目录
注意:此时此可执行程序只能在当前shell终端运行
解决方案:我们可以写一个shell脚本vi start.sh
内容为:
export LD_LIBRARY_PATH="/home/zzh/cteach/dynomic"
./try
最后给脚本赋予可执行权限sudo chmod a+x
然后每次要执行这个动态库文件直接./start.sh这个可执行脚本就行了
顺便补充一句:
删除环境变量
export -n LD_LIBRARY_PATH
查看环境变量
export echo LD_LIBRARY_PAT=补全
ldd指令查看所链接的库(判断是否加载成功):
例:
ldd try
nm指令:查看所调用的函数