linux 库封装

静态库:
在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
特点:
编译成功后不再依赖静态库。
依赖静态库的地方都会拷贝,占空间大

动态库:
在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
特点:
程序运行时需要有动态库才能运行。
使用时是共享不会拷贝,也称共享库。

windowns:
.dll 动态库.
.lib 静态库

Linux:
.a 静态库
.so.1.2 动态库,后面1.2属于库的版本

静态库:
命名规则:libxxx.a / libxxx.a
vi -O 文件名 ==》vi打开的文件,垂直分屏,-o 横分屏

静态库制作步骤:

  1. 原材料: .c 文件
  2. 将 .c 生成 .o 文件
    gcc -c a.c //生成a.o文件
  3. 将.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

动态库制作步骤:

  1. 原材料: .c 文件
  2. 将 .c 生成 .o 文件
    gcc -c a.c //生成a.o文件
  3. 将.o打包
    gcc -shared a.o -o libxxx.

动态库的使用:
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 发现还是没找着(自测不可以)

猜你喜欢

转载自blog.csdn.net/weixin_42411048/article/details/106592519
今日推荐