静态库:
在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
特点:
编译成功后不再依赖静态库。
依赖静态库的地方都会拷贝,占空间大
动态库:
在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
特点:
程序运行时需要有动态库才能运行。
使用时是共享不会拷贝,也称共享库。
windowns:
.dll 动态库.
.lib 静态库
Linux:
.a 静态库
.so.1.2 动态库,后面1.2属于库的版本
静态库:
命名规则:libxxx.a / libxxx.a
vi -O 文件名 ==》vi打开的文件,垂直分屏,-o 横分屏
静态库制作步骤:
- 原材料: .c 文件
- 将 .c 生成 .o 文件
gcc -c a.c //生成a.o文件 - 将.o打包
ar rcs libxxx.a a.o //用ar工具,打包a.o生成libxxx.a库
nm libxxx.a //可以查看静态库中有什么内容
静态库的使用:
main.c 文件中调用了库 libxxx.a中的函数
gcc main.c -I 库的头文件目录 -L 当前库的路径 -l库名
gcc main.c -I ./ -L ./ -l xxx // ./代表库在当前路径下面,名字是libxxx.a的库
动态库:
调用动态库中函数时才会加载,否则不会加载
命名规则:libxxx.a / libxxx.so
动态库制作步骤:
- 原材料: .c 文件
- 将 .c 生成 .o 文件
gcc -c a.c //生成a.o文件 - 将.o打包
gcc -shared a.o -o libxxx.so.1.2
动态库的使用:
main.c 文件中调用了库 libxxx.so中的函数
gcc main.c -I 库的头文件目录 -L 当前库的路径 -l库名
gcc main.c -I ./ -L ./ -l xxx // ./代表库在当前路径下面,名字是libxxx.so的库
file filename 可以查看filename是什么文件类型
env 查看linux下的所有环境变量
动态库使用报错解决:
./a.out 报错:
ldd app 可以查看app可执行文件执行需要链接哪些库
是libfunc.so 这个库不知道是在那个环境变量中,而报错
临时解决方法:
exprot 环境变量 动态库的路径
export LD_LIBRARY_PATH=./(有覆盖环境变量原来的值的风险)
export LD_LIBRARY_PATH=动态库的路径:LD_LIBRARY_PATH (这种拼接方法较为保险, : 拼接作用)
永久设置:
export LD_LIBRARY_PATH=动态库的路径
把以上这句话添加到环境变量中(用户级别 / 系统级别),重启终端
刷新环境配置也可以达到永久设置的效果: vi /etc/lb.so.conf 打开lb.so.conf文件,把动态库路径放进去即可。
执行 sudo ldconfig -v
ldd a.out 发现还是没找着(自测不可以)