1. 静态库
1.1 特点:
-
编译时把静态库中的相关代码复制到可执行文件中
-
程序中已包含代码,运行的时候不在需要静态库
-
程序运行时无需加载库,运行速度更快
-
占用更多的磁盘和内存空间
-
静态库升级之后,程序需要重新编译链接
1.2 创建:
-
编写库文件代码,编译为.o目标文件 gcc -c xxx.c
-
ar 命令创建 libxxx.a文件
-
ar -rsv libxxx.a xxx.o
-
静态库名字以lib开头,以.a后缀
-
1.3 链接库:
-
gcc -o xxx xxx.c -L. -lxxx
-
-L 表示库的路径 -l表示库的名称
2. 动态库(共享库)
2.1 特点:
-
程序中不包含库中代码,尺寸小
-
多个程序可以共享一个库
-
程序运行时需要加载库
-
库升级方便,无需重新编译程序
-
使用更加广泛
2.2 创建:
-
编写库文件代码,生成与目标位置无关的目标文件
-
gcc -c -fPIC xxx.c xxx.c
-
-
生成动态库
-
gcc -shared -o libxxx.so xxx.o xxx.o
-
2.3 链接库:
-
gcc -o xxx xxx.c -L. -lxxx
-
-L 表示库的路径
-
-l表示库的名称
-
2.4 错误
执行动态库可执行文件错误
-
/test:error while loading shared libraries:xxx.so,cannot open shared object file:NO such file or directory
-
含义:表示可执行文件找不到所使用的动态库
解决:
-
找到动态库,添加到/usr/lib里
-
使用 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 目录路径。添加在~/.bashrc文件里面,使用source ~/.bashrc生效。
2.5 shell命令
-
ldd xxx. 查看可执行文件使用的动态库的名称
-
nm xxx 查看文件符合清单