libbz2.a,libz.so导致tokyocabinet make失败问题解决方法 博客分类: tokyocabinet TokyoCabinetUbuntuLinuxGCCWeb
近日心血来潮,决定装了个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 ,我的旧博客~~)