静态库与动态库的制作与使用

请注意,本文编写于 251 天前,最后修改于 251 天前,其中某些信息可能已经过时。

静态库的制作与使用

静态库的制作

  1. 命名规则

    1. lib + 库的名字 + .a
    2. libmytest.a
  2. 制作步骤

    1. 生成对应的.o文件 --.c -->.o -c参数
    2. 将生成的.o文件打包 ar工具 ar rcs 生成静态库的名字(libMytest.a) 生成的所有的.o

      gcc *.c -c -I ../include/ 头文件在include
      ar rcs libMyCalc.a *.o
  1. 发布和使用静态库

    1. 发布的静态库
    2. 发布头文件
    3. 使用静态库

      gcc main.c lib/libMyCalc.a -I include/ -o sum
      gcc main.c -I include -L lib -l MyCalc -o myapp
      -I 指定头文件目录
      -L 指定库目录
      -l 指定使用哪个库 libMyCalc.a 需要去掉头尾 lib .a
      -o 生成二进制文件.o
      nm libMyCakc.a 可以查看有哪些.o
    4. 静态库优点

      1. 发布程序的时候,不需要提供对应的库

        1. 把库打包到对应的程序中,但是他只是用到那个.o的函数,则打包那个库中对应.o不是所有.o都打包了
      2. 库的加载速度快
    5. 静态库缺点

      1. 库被打包到应用程序中,导致应用的体积很大
      2. 库发生了改变,需要重新编译程序

共享库的制作与使用

共享库的制作

  1. 命名规则

    1. lib + 名字 + .so
  2. 制作步骤

    1. 生成与位置无关的代码(生成与未知无关的.o)
    2. 将.o打包成共享库(动态库)
    gcc -fPIC -c *.c -I ../include/
    gcc -shared -o libMyCalc.so *.o -I ../include
  3. 发布和使用动态库

    1. 发布动态库文件
    2. 发布头文件
    3. 使用动态库

      gcc main.c lib/libMyCalc.so -o calc -I include/ 正确
      gcc main.c -L lib -l MyCalc -o calc -I include/ 正确 但是↓
      ./calc 会报下面错误
      error while loading shared libraries: libMyCalc.so: cannot open shared object file: No such file or directory
      ldd 命令查询可执行程序执行时候,所依赖的所有动态的库
          linux-vdso.so.1 =>  (0x00007fffa3cbd000)
          libMyCalc.so => not found
          libc.so.6 => /lib64/libc.so.6 (0x00007fb4182bf000)
          /lib64/ld-linux-x86-64.so.2 (0x00007fb41868c000)
      动态链接器会自动调用动态库 通过lib64/ld-linux-x86-64.so.2加载动态器
      根据环境变量去查找动态库
  1. 第一种解决办法 不推荐 有可能会跟系统动态库冲突
     把我们生成的.so动态库 拷贝到根目录里的lib文件夹中 
sudo cp ./lib/libMyCalc.so /lib
  2. 第二种解决办法 临时测试用 一般推荐这个
     LD_LIBRARY_PATH 搜索动态库时会在搜索系统环境变量前,在这里面找
     在系统给我们提供的额外的搜索动态库环境变量,设置了一个当前目录下的lib文件夹,不过这个是临时的,终端关闭在开启就没有了
export LD_LIBRARY_PATH=./lib
./calc 此时文件则不会有任何问题
  3. 第三种解决办法 设置永久的 不推荐
cd
vim .bashrc
最后一行加上 重新打开终端 加载./bashrc
export LD_LIBRARY_PATH=/home/用户名/Calc/lib
  4. 第四种方法

     1. 需要找动态链接器的配置文件
     2. 动态库的路径写到配置文件中
     3. 更新  --  sudo ldconfig -v
cd /etc
ls -l ld.so.conf
sudo vim ld.so.conf
sudo ldconfig -v
  1. 动态库的优缺点

    1. 优点

      1. 执行程序体积小
      2. 动态库更新了,不需要重新编译程序

        1. 函数接口不变
    2. 缺点

      1. 发布程序的时候,需要将动态库提供给用户
      2. 动态库没有被打包到应用程序中,加载速度相对较慢