Linux C/C++编程之(十)动态库的制作和使用

一、概述

在这里插入图片描述

二、动态库的优缺点

机制:

  • 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

优点:

  • 节省内存(共享)
  • 易于更新(动态链接)
    • 停止运行程序
    • 使用新库覆盖旧库(保证新旧库名称一致,接口一致)
    • 重新启动程序

缺点:

  • 延时绑定,速度略慢

使用场合:

  • 对速度要求不是很强烈的地方都应使用动态库

注意事项:

  • 动态库是否加载到内存,取决于程序是否运行

命名格式:

  1. lib开头
  2. 动态库名
  3. .so结尾

三、动态库的制作

(1)制作步骤

1)生成“与位置无关“的目标文件。

gcc -fPlC a.c b.c c.c -c
  • 参数:-PIC 表示生成与位置无关代码
  • 执行完毕后生成一系列的 .o 文件

2)制作动态库

gcc -shared -o libmytest.so a.o b.o c.o
  • 参数:-shared 制作动态库
  • -o:重命名生成的新文件

3)使用动态库

gcc main.c -L ./ -Imytest -I / -o app
  • -L–>指定库所在的路径
  • 去掉前缀 lib
  • 去掉后缀 .so
  • 只留下中间部分
  • -I–>头文件目录位置

/.app–>运行失败

  • 查看依赖的共享库:ldd app 发现 libmytest 找不到
  • 没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径
  • 解决方案
    1. 临时设置:export LD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效
    2. 永久设置:将上条写入家目录下 .bashrc 文件中
    3. 粗暴设置:直接将 libmytest.so 文件拷贝到 /usr/lib/【/lib】目录下。(受 libc 库的启发)
    4. 将 libmytest.so 所在绝对路径追加入到 /etc/ld.so.con 文件,使用 sudo ldconfig-v 更新

(2)实际操作

  • 生成 .o 目标文件,文件路径和内容同上,进入到 src 目录,生成 .o 目标文件:
    在这里插入图片描述
  • 将 .o 文件打包生成动态库
    在这里插入图片描述
  • 使用生成的动态库,-L 指定动态库路径 -l 指定库名
gcc main.c -o main -I include/ -L ./lib -lCalc
  • 退出到 dongtai 目录下,将动态库拷贝到 lib 目录下并编译 main.c 并执行 main:
    在这里插入图片描述
    无法找到动态库目标文件,解决方法有三个:

(1)拷贝到 /lib 下(不允许,容易与别人库命名重合)
在这里插入图片描述
(2)将库路径增加到环境变量 LD_LIBRARY_PATH 中(不是特别推荐)
在这里插入图片描述
(3)配置 /etc/ld.so.conf 文件,增加 /home/linux/dongtai/lib/ 路径,执行 ldconfig -v,并执行 main
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、动态库

在这里插入图片描述

原文地址:https://www.cnblogs.com/hzcya1995/p/13302540.html