静态库与动态库

1.什么是库

  库是一段编译好的二进制代码,加上头文件就可以供别人使用。什么时候会用到库?一是某些代码需要给别人使用,但又不想暴露源代码,就需要以库的形式进行封装,只暴露出头文件;二是对于某些不需要经常修改的代码,为了减少编译的时间,就可以把它打包成库,因为库已经是编译的文件,编译的时候只需要链接,不会浪费编译时间。

  链接的时候就有静态和动态的,于是就有了静态库和动态库。

 

2.静态库

命名规则:

  例:libtest.a

  lib  ②xxx - 库的名字  ③.a

制作步骤:

  原材料:xxx.c 或 xxx.cpp

  将生成的.c文件转成.o文件(例:gcc a.c b.c -c)

  将.o文件打包:

    ar rcs 静态库的名字 原材料(.o文件)

    例:ar rcs libtest.a a.o b.o(ar意思是将将代码序列化)

  查看静态库的内容:nm libtest.a

使用方法:

  gcc test.c -I ./  -L ./lib -lmycalc -o app

  -I:指定头文件的路径

  -L:指定库的位置

  -l:指定库的名字(去掉lib和.a)

 静态库的创建过程:

 

 

3.动态库

命名规则:libxxx.so

制作步骤:

  将源文件生成.o文件(例:gcc a.c b.c -c fpic)

  打包:gcc -shared a.o b.o -o libxxx.so

使用方法:

  gcc test.c -I ./ -L ./ -ltest -o app

  -I:指定头文件的路径

  -L:指定库的位置

  -l:指定库的名字(去掉lib和.so)

动态库找不到文件问题解决:

  使用环境变量:

    临时设置:在终端输入:export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH

    永久设置:

      用户级别:在 ~./bashrc 文件中写入 export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH

           (配置完成要重启终端,或输入 source ~./bashrc)

      系统级别:在 /etc/profile 文件中写入 export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH

           (配置完成输入 source/etc/profile)

  修改文件列表/etc/ld.so.cache

    找到配置文件:/etc/ld.so.conf

    把动态库的绝对路径加入到文件中

    执行命令:sudo ldconfig -v  

 

4.静态库和动态库的优缺点

静态库

优点:①静态库被打包到引用程序中,加载速度快

   ②发布程序无需提供静态库,移植方便

缺点:①占用系统资源,浪费内存(多个程序使用同个库,库都会加载到内存中,浪费资源)

   ②更新、部署、发布麻烦

 

 

动态库

优点:①可实现进程间的资源共享

   ②程序升级简单

   ③开发者可以控制何时加载动态库

缺点:①加载速度比静态库慢

   ②发布程序需要提供依赖的动态库

 

 

posted @ 2021-02-10 11:40  さくらむすび  阅读(194)  评论(0编辑  收藏  举报