动态库的特点(linux)
- 命名上是以 *.so
- 目标文件在链接阶段只是指明链接的那个动态库,动态库与目标文件保持独立。在执行过程中需要该动态库
- 使用动态库生成的目标文件较小
动态库的制作
- gcc得到.o文件,得到和位置无关的代码
gcc -c -fpic/fPIC a.c b.c
- gcc得到动态库
gcc -shared a.o b.o -o libcalc.so
静态库: GCC 进行链接时,会把静态库中代码打包到可执行程序中 -
动态库: GCC 进行链接时,动态库的代码不会被打包到可执行程序中
-
程序启动之后,动态库会被动态加载到内存中,通过 ldd (list dynamicdependencies )命令检查动态库依赖关系
-
如何定位共享库文件呢?当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于 elf 格式的可执行程序,是由 ld-linux.so 来完成的,它先后搜索 elf 文件的 DT_RPATH 段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache 文件列表 ——> /lib/ , /usr/lib目录找到库文件后将其载入内存。
-
首先进行用户级别长久配置 环境变量 LD_LIBRARY_PATH
fs@ubuntu:~$ vim .bashrc
fs@ubuntu:~$ . .bashrc
fs@ubuntu:~$ cd /home/fs/Linux/lesson06/library
fs@ubuntu:~/Linux/lesson06/library$ ldd main
linux-vdso.so.1 (0x00007ffe07332000)
libcalc.so => /home/fs/Linux/lesson06/library/lib/libcalc.so (0x00007f74e3d7d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f74e398c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f74e4181000)
将lib路径添加到bashrc的最后一行中。
2.系统级别
fs@ubuntu:~/Linux/lesson06/library$ sudo vim /etc/profile
[sudo] password for fs:
fs@ubuntu:~/Linux/lesson06/library$ source /etc/profile
fs@ubuntu:~/Linux/lesson06/library$ echo $LD_LIBRARY_PATH
:/home/fs/Linux/lesson06/library/lib:/home/fs/Linux/lesson06/library/lib
发现拼接了好几个路径,问题可能是因为刚配置了用户级别的环境变量,重新打开新的终端进行尝试。
3./etc/ld.so.cache文件列表加入路径
fs@ubuntu:~/Linux/lesson06/library$ sudo vim /etc/ld.so.conf
fs@ubuntu:~/Linux/lesson06/library$ sudo ldconfig
静态库和动态库的区别
静态库、动态库区别来自链接阶段如何处理,链接成可执行程序。分别称为静态链接和动态链接方式。
静态库
- 优点:静态库被打包到应用程序中加载速度快,发布程序时无须提供静态库,移植方便。
- 缺点:消耗系统资源,浪费内存,更新麻烦。
动态库
- 优点:可以实现进程间资源共享,更新部署简单,可以控制何时加载动态库。
- 缺点:加载速度比静态库慢,发布程序时需要提供依赖的动态库。