昨天本来要做一个摘要库的拆分,前两天新摘要库就开始建了,把摘要程序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函数,需要对数据库进行操作的程序就会与该库进
行连接。数学应用程序使用数学库libm,X-Windows应用程序使用Xlib库,
libX11。另外,所有的程序都将使用标准的C函数库。libc,该库中包含了内
存管理或输入输出操作的基本函数,这些库都存放在/usr/lib这些系统公用
的目录中,系统中的任何用户都可以利用这些库。当然用户也可以建立自己
专用的库函数,供自己或其它指定的人员使用。
库可以有三种使用的形式:静态、共享和动态。静态库的代码在编译时就
已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,
在编译时,只是简单地指定需要使用的库函数。动态库则是共享库的另一种变
化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数
不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。动态库
可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。由
于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的
引用,因此代码的规模比较小。
已经开发的大多数库都采取共享库的方式。ELF格式的可执行文件使得共享