静态库&动态库的基本制作与使用

1、命名规则

  • 静态库:lib+名称.a —> libSian.a
  • 动态库:lib+名称.so —> libSian.so

2、静态库制作

  • 准备目录:include、lib、src
  • 头文件存放在include中,源文件存放在src中,库文件存放lib中
  • 生成.o文件:在src目录中gcc -c *.c -I ../include // 大写i不是小写l
  • 生成.a文件:ar rcs lib/libCalc.a src/*.o // 将src下的所有.o文件在lib目录下生成.a文件
  • 利用静态库编译源文件:
    • gcc main.c lib/libCalc.a -o main.out -I include
    • gcc main.c -L lib -l Calc -I include // L库目录,l库名称(不带lib前缀)
  • 整体目录结构及生成文件
    • ├── include
      • └── head.h
    • ├── lib
      • └── libCalc.a
    • ├── main.c
    • ├── main.out
    • └── src
      • ├── sub.c
      • ├── sub.o
      • ├── sum.c
      • └── sum.o
  • nm命令:nm lib/libCalc.a 可查看.a文件的内容,nm main.out同样可以查看

3、静态库的优缺点

  • 优点:
    • 编译时会根据需要以.o为单位包含库中的内容
    • 发布程序时,不需要提供相对应的库(因为已经打包到应用程序中)
    • 加载库时速度快
  • 缺点:
    • 程序体积变大;
    • 库发生变化需要重新编译

4、动态库制作

  • 生成与位置无关的.o文件
    • gcc -fPIC -c *.c
  • 生成动态库.so文件
    • gcc -shared src/*.o -o lib/libCalc.so
  • 使用动态库编译源文件
    • gcc main.c lib/libCalc.so -o main.out -I include // 方式一
    • gcc main.c -L lib -l Calc -o main1.out -I include // 方式二
    • 两种方式都能生成可执行文件,但方式二生成的执行文件在执行时会报错,./main.out: error while loading shared libraries: libCalc.so: cannot open shared object file: No such file or directory
    • 解决动态库无法找到的问题:
    • 使用lld命令查看可执行文件:ldd main1.out
    • 出现该问题的原因是无法通过环境变量找到动态库文件
    • 方法一:将libCalc.so拷贝到/lib下即可解决;(不推荐)
    • 方法二:export LD_LIBRARY_PATH=./lib 临时导入可以解决,当前终端生效;(临时)
    • 方法三:如果需要每次打开时都有效,在~.bashrc文件的末尾行添加上述指令;(重启终端)
    • 方法四:修改/etc/ld.so.conf文件,加入lib的绝对路径,sudo ldconfig -v更新 (建议)

5、动态库优缺点

  • 优点:
    • 动态库更新不需要更新源程序(接口不变情况下)
    • 执行程序体积小,不需要打包到应用程序中
  • 缺点:
    • 发布程序时需要提供给用户
    • 没有打包到应用程序中,执行效率相对慢一点

Leave a Reply