库的好处:1.代码保密 2.方便部署和分发
库的分类:静态库和动态库
区别为:静态库在程序的链接阶段被复制到程序中,动态库在链接阶段没有被复制到程序中,而是在程序运行时,由系统动态加载到内存中供程序调用。
静态库的制作
命名规则:
linux:lib+xxx+.a
windows:libxxx.lib
第一步,gcc获得.o文件
第二步,将.o文件打包,使用ar工具 例 ar rcs libxxx.a xxx.o xxx.o
(r-将文件插入备存文件中 c-建立备存文件 s-索引)
动态库的制作
命名规则:
linux:libxxx.so
windows:libxxx.dll
第一步,gcc得到.o文件,得到和位置无关的代码
gcc -c -fpic/fPIC a.c b.c
第二步,gcc得到动态库
gcc -shared a.o b.o -o libcalc.so
在程序启动之后,动态库会被动态加载到内存中,通过ldd命令检查动态库的依赖关系
如何定位共享库文件?
当系统加载可执行代码的时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获得该绝对路径,对于elf格式的可执行程序,是由ld-linux.so来完成,先后搜索elf文件的 DT_RPATH段 --- > 环境变量 ---> LD_LIBRARY_PATH ---> /etc/ld.so.cache文件列表 ---> /lib/,/usr/lib 目录找到库文件,然后将其载入内存