共享库在程序编译时并不会被链接到目标代码中,而是在程序运行时才载入。不同程序需要相同的库时,在内存中只需要有一份该共享库的拷贝,避免了空间浪费问题。并且在运行时才会被载入,也解决了静态库对程序的更新,部署和发布带来的麻烦
共享库的制作:
1. 将.c文件编译成.o文件
gcc -fpic -c fun1.c fun2.c
2.使用gcc将.o文件编译成库文件
gcc -shared fun1.o fun2.o -o litest2.so
#注意与静态库的不同 gcc -shared .so
动态库的使用
和静态库使用类似。
gcc -o main2 main.c -I./include -L./lib -ltest2
但是运行:./main2时,竟然报错:找不到libtest2的库
ldd加载器可以查看文件链接的库函数
如何让系统找到库
方法很多,只记一个最常用:
永久设置,把 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径,设置到~/.bashrc文件中(添加到最后即可),然后在执行下列三种方法之一:
执行 . ~/bashrc 使配置文件生效。
执行source ~/.bashrc使配置文件生效
退出当前终端,然后再次登录也可以使配置文件生效
动态库文件在编译的时候,连接器需要使用参数-L找到库文件所在的路径。
在执行的时候,是加载器ldd根据动态库的路径进行加载的,与编译时候用的-L指定的路径无关