花了我快半天的时间,居然是因为链接库版本不对

本文讲述了作者在Linux环境下遇到的一个程序异常问题,由于链接的bdb动态库版本不匹配,导致程序出错。作者通过gdb调试发现是opendb错误,经过对比源码和静态库,发现是bdb库版本不兼容。最终通过指定链接库路径解决,揭示了Linux下动态库版本管理的重要性。此外,还介绍了Linux库的类型、创建和使用方法。
摘要由CSDN通过智能技术生成

昨天本来要做一个摘要库的拆分,前两天新摘要库就开始建了,把摘要程序copy过来,运行,看log,居然出线socket err!吓了我一跳,这个错误应该是不会出现的,再仔细把改的脚本看了一遍,确定无误。我猜想是不是摘要程序的问题,于是,我从svn上更新了摘要程序源码,编译,运行。

       这下可真的是傻眼了,程序core了!!!svn的代码居然错了!!!

       gdb一看,居然是opendb error,我的bdb库打开错误。真的是惊奇,诧异……原以为是svn的代码哪里改了,check了一下确认改动的地方和这个无关,于是又找到原来的源码编译了一下,也是core。无语~~!

       最后,比较了源码还有静态库无果的情况下,我下意识的ldd了一下两个程序,哈~~,bdb的动态库链接居然不一样:      一个是libdb-4.1.so,一个是libdb-4.2.so

       真相大白了,我这台机子的bdb的版本是4.2的,居然和原来的4.1不兼容,而我用的bdb的包装静态库,居然只支持4.1 !真不知道那个bdb的静态库是怎么写的。

       Ok,要解决问题了,由于linux下的动态库都是有版本控制的,新的版本的被注册到ldconfig里面,这样编译的时候,链接的都是最新的库。我试着将链接bdb的路径指到/lib(Makefile里用L/lib指定ldb的路径),发现在这个路径下也有4.2的动态库。后来看了看网上的资料,原来直接写绝对路径编译就可以了。嗯,问题解决了,也耗了我好多时间,不过凡事都有第一次,下回的有经验了,呵呵~~。

 

 

       Ps:附上我找到的关于linux下动态库方面的文章。

 

 

 

[以下内容整理自《创建和使用库》一文,作者不详]

 

  C语言中有一些函数不需要进行编译,也可以在多个文件中使用。

  一般来说,有此函数会执行一定的标准任务,如数据库输入/输出操作或

屏幕控制等。可以事先对这些函数进行编译,然后将它们放置在一些特殊的目

标代码文件中,这些目标代码文件就称为库。

  库文件中的函数可以通过连接程序与应用程序进行连接。这样就不必在每

次开发程序时都对这些通用的函数进行编译了。

 

  不同类型的应用程序会使用不同的函数库。例如:libdbm库中组包含了对

数据库文件进行访问的dbm函数,需要对数据库进行操作的程序就会与该库进

行连接。数学应用程序使用数学库libmX-Windows应用程序使用Xlib库,

libX11。另外,所有的程序都将使用标准的C函数库。libc,该库中包含了内

存管理或输入输出操作的基本函数,这些库都存放在/usr/lib这些系统公用

的目录中,系统中的任何用户都可以利用这些库。当然用户也可以建立自己

专用的库函数,供自己或其它指定的人员使用。

 

 

  库可以有三种使用的形式:静态、共享和动态。静态库的代码在编译时就

已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,

在编译时,只是简单地指定需要使用的库函数。动态库则是共享库的另一种变

化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数

不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。动态库

可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。由

于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的

引用,因此代码的规模比较小。

 

  已经开发的大多数库都采取共享库的方式。ELF格式的可执行文件使得共享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值