什么是共享库
共享库的名字一般是 libxxx.so,共享库又称动态库;
机制:多个程序共享一份库文件,当程序实际调用到库函数时加载库函数。
优点:节省系统资源
缺点:相较于静态库调用库函数效率低。
场景: 存储资源要求较高 或者更新频繁的程序
相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。
动态库就是在程序载入内存的时候才真正把函数代码链接进来确定他们的地址,并且就算多个程序运行,内存也只存在一份代码。由于动态库的代码必须满足这样一个条件:能被加载到不同进程的不同地址,所以代码必须经过特别的编译处理。我们把这种特殊处理的代码叫做 ”位置无关的代码“
由于函数库没有被整合进你的程序,而是程序运行时动态申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减少应用程序的体积。
注意:不管是静态函数库还是动态函数库,都是由*.o目标文件生成。
如何自作共享库
共享库的创建比较简单,基本有两步。首先使用 -fPIC 或 -fpic 创建目标文件, PIC或pic表示位置无关代码,然后就可以使用以下格式创建共享库了:
gcc -share -Wl, -soname, you_soname -o library_name file_list library_list
简单的制作过程演示:
第一步,先将源文件编程成“.o”目标文件
gcc -fPIC -c zploo1.c -o zploo1.o gcc -fPIC -c zploo2.c -o zploo2.o gcc -fPIC -c zploo3.c -o zploo3.o
第二步,将所有的 .o 目标文件制作成 .so 共享库文件
gcc -shared -o libxxxx.so zploo1.o zploo2.o zploo3.o
第三步,使用 制作好的共享库文件 编译main.c 生成最终可执行文件
gcc main.c -o app -I 头文件路径 -L 库文件路径 -l库名
第四步,执行最后生成的可执行文件
./app : 错误: 链接器(程序编译之后链接阶段)、动态链接器(程序运行阶段)
1)拷贝文件法:cp libxxxx.so /lib
2)环境变量法:export LD_LIBRARY_PATH=动态库所在路径
3)配置文件法:export LD_LIBRARY_PATH=动态库所在路径 写入.bashrc文件中
4)缓存文件法:sudo vi /etc/ld.so.conf 添加动态库所在路径到文件中(绝对路径)