`

libbz2.a,libz.so导致tokyocabinet make失败问题解决方法

 
阅读更多

近日心血来潮,决定装了个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  ,我的旧博客~~)


文章来源:http://henry2009.javaeye.com/blog/462705(javaeye旧博客)

分享到:
评论

相关推荐

    libbz2.dll

    libbz2.dll

    libbz2_0-1.0.2-1.tar.zip_libbz2.l_libbz2_0-1.0.2-1.tar_linux li

    标题中的"libbz2_0-1.0.2-1.tar.zip_libbz2.l_libbz2_0-1.0.2-1.tar_linux li" 提到了几个关键元素,首先是"libbz2",这是一个知名的开源软件库,用于提供Bzip2数据压缩算法的接口。"0-1.0.2-1"是版本号,表示这是该...

    ios ffmpeg库

    3. **编写代码**:根据需求调用FFmpeg API,例如使用`avformat_open_input`打开音视频文件,`avformat_find_stream_info`获取流信息,`avcodec_decode_audio4`或`avcodec_decode_video2`解码音频或视频帧,以及`...

    iOS下打包的ffmpeg静态库.a,h264

    PS:添加以后只需要libz.tbd,libbz2.tbd,libbz2.1.0.tbd和libiconv.tbd就可以编译通过 但是再写了代码之后跑不通了,又花了将近一天时间发现还需要添加VideoToolBox,CoreVideo,AVFoundation和CoreMedia这几个...

    【QGIS跨平台编译】之【libbz2跨平台编译】:MacOS环境下编译成果(支撑QGIS跨平台编译,以及二次研发)

    一、内容概况 QGIS是一个开源的、跨平台的地理信息系统(GIS)软件,用于浏览、编辑和分析地理空间数据,提供了一套丰富的功能,...当前采用的版本为libbz2-1.0.6,如果下载者,需要其他版本的libbz2,请在评论区留言。

    bzip2-1.0.2.tar.gz

    `bzip2-1.0.2.tar.gz` 是一个经典的压缩包文件,它包含的是 `bzip2` 压缩库的源代码版本为 1.0.2。`bzip2` 是一个开源的、免费的、无专利限制的数据压缩工具,由 Julian Seward 创建。它以其高效率和优良的压缩比而...

    elfutils-libs-0.152-1.el6.i686.rpm

    elfutils-libs-0.152-1.el6.i686.rpm是centos工具包。

    bzip2-1.0.6库文件

    静态库(libbzip2.a)可以直接链接到项目中,而动态库(bzip2.dll)则需要在运行时提供。同时,需要包含头文件`bzlib.h`来使用bzip2的API。 4. **C++封装** 为了更好地与C++集成,开发者通常会编写C++封装类,将...

    GraphicsMagick

    图形Magick建立z CFLAGS =“-g -O3 -fPIC” ./configure --prefix = $ {INSTALL_DIR} 制作进行安装建立bz2 make -f Makefile-libbz2_so 进行安装PREFIX = $ {INSTALL_DIR} cp libbz2.so.1.0.6 $ {INSTALL_DIR} / lib...

    IJKMediaFramework

    视频播放框架,可用于直播等视频播放。...libbz2.tbd libz.tbd MediaPlayer.framework MobileCoreServices.framework OpenGLES.framework QuartzCore.framework UIKit.framework VideoToolbox.framework

    lib.tar.bz2

    arm-nono-linux-gnueabi lib

    _bz2.cpython-36m-x86_64-linux-gnu.so,.zip

    标题中的"_bz2.cpython-36m-x86_64-linux-gnu.so"是一个动态链接库文件,它是Python解释器用于处理Bzip2压缩格式的底层实现。Bzip2是一种广泛使用的数据压缩算法,其特点是能够提供较高的压缩比,但压缩和解压缩速度...

    FFmpeg-iOS

    iOS平台,包含libx264及fdk-aac的FFmpeg头文件及lib文件 ...1. libbz2.tbd 2. libz.tbd 3. libiconv.tbd 4. CoreMedia.framework 5. VideoToolbox.framework 6. AudioToolbox.framework 7. AVFoundation.framework

    【QGIS跨平台编译】之【libbz2跨平台编译】:Windows环境下编译成果(支撑QGIS跨平台编译,以及二次研发)

    一、内容概况 QGIS是一个开源的、跨平台的地理信息系统(GIS)软件,用于浏览、编辑和分析地理空间数据,提供了一套丰富的功能,...当前采用的版本为libbz2-1.0.6,如果下载者,需要其他版本的libbz2,请在评论区留言。

    ONS模拟器Windows版.zip (ONScripter)

    6. **错误处理**:如果游戏无法正常运行,可能是由于兼容性问题、资源不完整或者脚本错误导致的,此时需要检查游戏文件的完整性,或者尝试更新模拟器至最新版本。 7. **社区支持**:由于ONScripter是一个开源项目,...

    cmake-2.6.2-src

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

    ffmpeg 2018-03-04 vs2015 Win10X64编译,X64版本,静态库 MT 集成36个第三方静态库

    libbz2.lib libcdio.lib libcdio_paranoia.lib libfontconfig.lib libfreetype.lib libfribidi.lib libgcrypt.lib libgme.lib libgmp.lib libgnutls.lib libgpg-error.lib libharfbuzz.lib libhogweed.lib libiconv....

    bzip2-1.0.5-bin.zip

    "libbz2.dll.a" 是动态链接库文件(在Windows系统中通常表示为.lib,但在某些情况下可能是.dll),它是运行时所需的库,用于支持那些在编译时没有静态链接bzip2功能的程序。"bzip2-bcc.lib" 可能是针对特定编译器...

    【QGIS跨平台编译】之【libbz2跨平台编译】:Linux环境下编译成果(支撑QGIS跨平台编译,以及二次研发)

    一、内容概况 QGIS是一个开源的、跨平台的地理信息系统(GIS)软件,用于浏览、编辑和分析地理空间数据,提供了一套丰富的功能,...当前采用的版本为libbz2-1.0.6,如果下载者,需要其他版本的libbz2,请在评论区留言。

    bzip 解压缩处理API函数

    在`bzip2-1.0.5`这个压缩包中,除了核心的API函数,还可能包含头文件(如`bzlib.h`),其中定义了这些函数的原型,以及库文件(如`libbz2.a`或`libbz2.so`)供链接使用。开发人员需要将这些文件包含到他们的项目中,...

Global site tag (gtag.js) - Google Analytics