共享库与静态库的区别在于,共享库只是在调用模块中嵌入调用代码的在库的相对位置的地址,当执行程序时,共享库会和程序一起加载到内存中,当执行到调用共享库中代码的指令时跳转到共享库中执行,执行完毕后在跳转回来。
相比于静态库占用空间小,方便更新(共享库发生变化后,程序不需要再次编译),但相比于静态库执行效率略低。
共享库以.so结尾,Linux下需要以lib开头
下面将以libmath.so来说明如何创建和使用共享库。
1、创建共享库
编译出位置无关目标文件(也就是在编译时加上-fpic):
gcc -c -fpic x1.c x2.c-> x1.o x2.o
链接生成共享库:
gcc -shared x1.o x2.o -o libmath.so
2、调用共享库
可以直接调用共享库:需要调用者要和共享库库在同一路径下
gcc main.c libmath.so
设置环境变量:
1.打开 vim ~/.bashrc 文件
2.在文件末尾添加一行
export LIBRARY_PATH=$LIBRARY_PATH:库文件的路径(如果需要删除环境变量,需要在~/.bashrc中删除环境变量后,关掉终端,重新启动终端才能生效)
3.重新加载配置文件 source ~/.bashrc
4.编译时要指定库名
gcc main.c -lmath(-l是在编译时加库,math是libmath.so去掉lib和.so)
设置编译参数:-L共享库的路径
gcc main.c -L共享库的路径 -lmath
3、运行
在使用共享库时,调用者只是记录了被代码在库的位置,因此在执行时需要共享库同时被加载。操作系统会根据LD_LIBRARY_PATH环境变量的设置来加载共享库。