欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

libbz2.a,libz.so导致tokyocabinet make失败问题解决方法 博客分类: tokyocabinet TokyoCabinetUbuntuLinuxGCCWeb 

程序员文章站 2024-03-23 16:29:10
...

近日心血来潮,决定装了个Ubuntu 9.10 live cd做编程开发。没想到wbui.exe也不是什么方便的东西,如果在安装之前你不幸选择了简体中文~~~~呵呵,不好意思,慢慢等吧,它会慢悠悠地连接到国外,为你用心良苦的下载中文依赖包(如果你家早已光纤入屋,那恭喜,你是不会有这个麻烦的)。没有一个晚上,绝对搞不定~~
建议:
1、安装英文版。装好了系统再上网下载,至少你能看到界面,可以做做简单操作~心里踏实。
2、苦心下载一个4.5g dvd版的ubuntu。中文正常的很,不过好像装好后是繁体,还是要上网下载简体中文包(如果你不介意繁体,那算是解决问题)
3、如果很不幸掉进了简体中文,不要害怕,在它下载安装包的过程中,按下crtl+alt+F2,调到其他工作界面,常用字符节目的应该都很熟悉,然后用ps aux查看那里是apt-get的程序进程,找到pid,把它kill掉就ok了。它就会进入后续安装,马上就要有系统界面了!!有了节目,大家都有种感觉,踏实了,linux平安到布~~~


近期闹得火红的小日本B+数据库tokyocabinet(以下简称tc),性能确实不容置疑,但是安装却老是出问题,问题都出自于一大堆的依赖错误。要搞定确实折腾!主要问题是tc要依赖bzip2,还有libbz2这个linux常规压缩工具。说是常规,但是ubuntu,opensuse常规是不会安装的。搞不懂,哪来常规。
也许常规是对Radhat而言的,我用5.3企业版的radhat不会出现这种麻烦事。
因为工具太常规所以一般人不会注意问题所在,更有看过,网上认为这是tokyocabinet一个bug。

言归正传,说说具体问题吧。
问题:
1、tc make file时候,当碰到依赖libbz2.a或者libz.a这两个库的时候会出现编译错误。
诸如:
 缺少zlib.h这个文件
//******************************************************************************************************************************//
/usr/bin/ld: /usr/local/lib/libbz2.a(bzlib.o): relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libbz2.a: could not read symbols: Bad value
collect2: ld 返回 1
make: *** [libtokyocabinet.so.8.22.0] 错误 1
//******************************************************************************************************************************//
/usr/bin/ld: /usr/local/lib/libz.a(crc32.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libz.a: could not read symbols: Bad value
make: *** [libtokyocabinet.so.8.22.0] 错误 1
//******************************************************************************************************************************//

凡是这两个问题,很重要一个原因是bzip的开发依赖包没有装好,或者没装。
首先要下载这两个安装包
1、bzip2-1.0.4.tar.gz
2、zlib-1.2.3.tar.gz

我上网找过很多解决方法。但是问题依旧,依然编译不过去。
即使用了ubuntu的apt-get install libbz2-dev。。。
网上一般都是修改bzip源码包的Makefile文件。(装个小东西,知识一定要丰富!)

网上的解决方法:
在gcc编译参数中加入-fPIC(对于该参数,我在备注中有解释,适合菜鸟级c语言用户理解)
但是问题,有时后就只刁难你,还是不怎么奏效。

我总结了一下方法:
1、注意顺序问题:(这三个东西一环扣一环,真麻烦)
如果发现 libbz2.a: could not read symbols: Bad value
就应该把/usr/local/lib中的libbz2.a删掉
进入解压缩的zlib-1.2.3目录,用make clean命令清理一下。
同样,/usr/local/lib/libz.a: could not read symbols
操作同上,删掉libz.a,把bzip2-1.0.4目录的编译文件清理一下。
如果找不到这两个文件的位置,可以在终端敲上:
find -name libbz2.a
....

2.修改zlib-1.2.3的Makefile文件
把gcc的编译参数加上 -fPIC
原文:CFLAGS=-O3 -DUSE_MMAP
修改为:CFLAGS=-O3 -DUSE_MMAP -fPIC
如果还是过不去,劝你硬来CC=gcc 直接后面跟上-fPIC让他们全部独立编译
重申:如果你之前编译过了,一定要用make clean清掉,否则还是徒劳。。
最后make 还有 make install

3.修改bzip2-1.0.4的Makefile文件
CC=gcc -fPIC  《===这个就是我发飙的结果,全部让他 -fPIC
AR=ar
RANLIB=ranlib
LDFLAGS=

BIGFILES=-D_FILE_OFFSET_BITS=64
CFLAGS=-fPIC -Wall -Winline -O2 -g $(BIGFILES)  《===当然这里也可以加上

同样,bzip2有一个Makefile-libbz2_so的文件,编译时会调用,当然你也可以单个编译:
make -f Makefile-libbz2_so
make clean <------------保守建议,还是clean一下
make
make install


具体bzip2的安装方法可以参照:
http://lamp.linux.gov.cn/Linux/LFS-6.2/chapter06/bzip2.html

最后重新安装tc
我用的是最新版本:tokyocabinet-1.4.31.tar.gz
估计应该修复了一些bug。
make clean
make
当输出:
#================================================================
# Ready to install.
#================================================================
一切ok,装吧 make install

测试下tc
/web/ttserver# tchmgr create test.tch
/web/ttserver# ls
test.tch
/web/ttserver# tchmgr put test.tch 1 test1
/web/ttserver# tchmgr put test.tch 2 test2
/web/ttserver# tchmgr get test.tch 2
test2

测试成功!
(opensuse用户,不能安装tokyocabinet的,也可以按照此方法修改Makefile文件)


备注:
fPIC参数解释:
-fpic
原文:Position independant code, needed for shared libraries.
我的理解:独立编译代码,需要共享苦支持(菜鸟级译法)
-fPIC
Position independant code, needed for shared libraries.
I am a bit in the dark what exactly the difference between -fpic and -fPIC is. It seems that -fPIC works always while -fpic produces smaller object files.
我的理解:这两个参数的不同在于,下面这个是总会执行,上面小写的只提供更小的对象文件编译。

 

(摘自:163博客,http://liuziheng5726.blog.163.com libbz2.a,libz.so导致tokyocabinet make失败问题解决方法
            
    
    博客分类: tokyocabinet TokyoCabinetUbuntuLinuxGCCWeb  ,我的旧博客~~)