Linux应用程序找不到动态库怎么办?

描述

1、静态库与动态库

所谓的库,其实都是一些二进制的可执行文件集合,静态库在linux中一般命名形式为libxxx.a,而动态库一般常用libxxx.so。

他们都可以通过源文件编译得到,往期对这两种库都过介绍:

Linux应用编程之静态库的制作与使用

Linux应用编程之动态库的制作与使用

Linux应用编程之动静态链接库辅助技巧(ldd,-static)

对于静态库主要是用于程序编译的过程中提供相应的函数实现,最终使用到该静态库中的内容会整合到最终的程序中,这样程序在运行过程中就不再依赖外部其他库了。

而动态库并不是用于编译期,而是在运行期通过动态加载器来加载库函数,使得可执行程序得以运行,当然动态链接也分不同的加载时期,相对比较灵活,有些程序一运行就需要进行加载,而有些的动态库是在执行过程中加载。

2、动静态库优缺点

那么动态库与静态库的优缺点也比较明显,使用静态库编译生成的可执行文件对外界没有什么需求,依赖少,相应的其可执行程序体积变大,一旦修改需要重新编译。

而对于动态库,由于是程序运行时候加载相应的动态库,所以其可执行文件相对要小很多,同时对于库的修改,仅仅编译和替换相应的动态库即可,更加的方便。

3、Linux中动态库的查找

由于可执行程序依赖动态链接库,所以存在一个问题:从哪里找动态链接库?,经常我们动态编译的可执行应用程序,由于系统中、或者自己没有指定相应的库路径,就会报运行失败,提示缺少相应的库。

Linux

这样就需要在系统中安装对应的库,并且把库放在动态加载器所能搜索到的位置,在linux中有如下几种搜索路径:

1、在可执行程序编译的时候通过编译选项指定相应的动态库路径,这样在程序运行的时候就会在文件系统对应路径加载对应的动态库,比如通过使用-Wl,-rpath=your path来进行编译,编译成功的可执行程序你可以使用ldd命令来查看是否路径指定成功,可执行程序几乎是第一时间搜索该路径查看动态库是否存在。

2、通过使用环境变量 : LD_LIBRARY_PATH指定,可以使用如下命令进行查看:

1echo $LD_LIBRARY_PATH

通过export在已有的路径上进行添加:

1export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:your path

跟之前给大家介绍的PATH环境变量的使用是一致的,当可执行程序找到指定路径,会在该环境变量中指定的路径进行查找,当然修改该环境变量会影响到所有的应用程序动态加载的搜索。

3、系统默认的路径/lib和/user/lib进行搜索,当然在用户级的程序大部分都会安装在/usr/local中,所以用户级的库大部分也会放在/user/local/lib路径中。

4、当然在Ubuntu中还通常在配置文件/etc/ld.so.conf中指定的动态库搜索路径,不过要记得当我们把相应的动态库路径添加进入以后,需要使用ldconfig进行配置才能生效。

最 后

好了,这里小哥就简单介绍了动态库与静态库的差异,以及Linux系统一般如何搜索动态库,本系列文章后续还会更新,记得关注学习哦。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分