1. 概念和区别
(1)静态链接:
概念:链接器在链接时将库的内容加入到可执行程序。
优点:①对运行环境依赖小,兼容性好。
缺点:①程序运行时就将库函数读入内存,内存占用大;
②库函数更新后,必须重新编译应用程序。
(2)动态链接:
概念:链接器在链接时仅建立与所需库函数之间的链接关系,程序运行时才将库调入程序。
优点:①程序需要时才读入相应库,内存占用相对小;
②库函数更新后,无需重新编译应用程序;
③多个进程可共享同一动态库。
缺点:①版本问题严重;
②需要时才载入动态库,增加程序延迟。
静态编译和动态编译:
2. 静态库和动态库制作
2.1 静态库的制作
静态库命名规则:
前缀lib,中间库名,后缀.a;如libxxx.a
静态库制作过程:
将.h,.c源文件编译成.o目标文件,再用静态库制作工具ar将.o目标文件制作为libxxx.a静态库。
ar的参数:
r:更新;c:创建;s:建立索引。
示例:
S1:将.h,.c源文件编译成.o目标文件:
S2: 使用ar工具将.o文件打包为.a静态库:
ar -rcs libxxx.a(生成的静态库) *.o(参与制作的.o目标文件)
S3:编译
编译方法如下:
gcc test.c -I头文件路径 -L库路径 -l静态库名字(去掉前缀lib和后缀.a) -o 生成可执行程序名
2.2 动态库的制作
动态库命名规则:
前缀lib,中间库名,后缀.so;如libxxx.so
动态库制作过程:
S1: -fpic生成与位置无关的.o目标文件
gcc -fpic -c *.c
S2:-shared生成共享库
gcc -shared *.o -o libxxx.so
S3:为保证链接时能够找到库,可以使用如下4种做法:
方式1:
永久将动态库路径设置到系统环境变量文件~/.bashrc或/etc/profile中:
vim ~/.bashrc
最后一行添加:
export LD_LIBRARY_PATH=动态库绝对路径
使环境变量生效:
source ~/.bashrc
方式2:
将动态库的信息加入到/etc/ld.so.conf中
执行下面命令让配置生效:
ldconfig -v
方式3:
使用符号链接(绝对路径)
方式4:
临时将动态库路径设置到系统环境变量中:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库绝对路径
方式5:
将生成的动态库放入标准库目录/lib或/usr/lib(不推荐)
cp libtest.so /lib
编译。此时不再需要指定-L库路径
gcc test.c -I. -ltest