Linux的动态库与静态库

什么是库

库的本质是一种可执行的二进制文件


在windows和Linux下都存在着大量的库,库是什么呢?本质上来说,库时一种可执行代码的二进制形式,可以被操作系统载入内存执行。

为什么使用库

避免重复造轮子


库通常是别人或者自己写好的某些公用函数、算法公式、针对某一个特定功能所实现的一些代码,然后封装成库,可以直接调用使用。
所以库是别人写好的,现有的,成熟的,可以服用的代码,你可以使用但要必须得遵守许可协议。在我们现实开发过程中,不可能每一份代码都从头编写,当我们拥有库时,我们就可以直接将我们所需要的文件链接到我们的程序中。可以为我们节省大量的时间,提高开发效率。

静态库 libxxx.a & 动态库libxxx.so

例如有3个文件 time.c time.h 、 test.c调用了time.c中的函数了

gcc 生成静态库和动态库

  ##无论静态库还是动态库都是由.o文件生成的,所以将time.c编译成time.o
  ##
  gcc -c time.c  //生成time.o
  ar cr libmytime.a time.o  //生成libmytime.a
  ## 静态链接
  gcc -o test test.c -static -lmytime -L.  //注意L后面的点

  ##动态库
  gcc -shared -fPCI -o libmytime.so time.so
  mv libmytime.so /usr/lib  或者使用 LD_LIBRARY_PATH
  gcc -o test test.c -lmytime -L.

CmakeLists.txt生成动态库和静态库

  • 动态库 ADD_LIBRARY(lib-name SHARED ${LIB_SRC})
  • 静态库 ADD_LIBRARY(lib-name ${LIB_SRC}) ##默认就是static Library

着重强调一下动态库的使用

从上面可以看出,静态可执行程序不依赖任何外部库就可以运行。
动态可执行程序程序需要外部共享库来提供运行所需的许多函数。

 
那么,如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader)
动态装入器负责装入动态链接的可执行程序运行所需的共享库。
动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache

/etc/ld.so.conf

include /etc/ld.so.conf.d/*.conf
## 所以它包含了/etc/ld.so.conf.d/文件夹下的各个lib的config文件
  • 查看可以“看到”的共享库 sudo ldconfig -p | grep libopencv*
  • 更新动态库
cd /etc/ld.so.conf.d 
sudo touch ****.conf  //例如 opencv.conf
然后在配置文件中添加上相对应的安装的库文件路径(安装时候的CMAKE_INSTALL_PREFIX指定的路径)  
//例如 /usr/local/lib
sudo liconfig

LD_LIBRARY_PATH

 要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH 变量设置成您希望搜索的目录。多个路径之间用冒号分隔

export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"

导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。

猜你喜欢

转载自blog.csdn.net/CSDNhuaong/article/details/80949399
今日推荐