posts - 12, comments - 3, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          近日心血來潮,決定裝了個(gè)Ubuntu 9.10 live cd做編程開發(fā)。沒想到wbui.exe也不是什么方便的東西,如果在安裝之前你不幸選擇了簡體中文~~~~呵呵,不好意思,慢慢等吧,它會(huì)慢悠悠地連接到國外,為你用心良苦的下載中文依賴包(如果你家早已光纖入屋,那恭喜,你是不會(huì)有這個(gè)麻煩的)。沒有一個(gè)晚上,絕對搞不定~~
          建議:
          1、安裝英文版。裝好了系統(tǒng)再上網(wǎng)下載,至少你能看到界面,可以做做簡單操作~心里踏實(shí)。
          2、苦心下載一個(gè)4.5g dvd版的ubuntu。中文正常的很,不過好像裝好后是繁體,還是要上網(wǎng)下載簡體中文包(如果你不介意繁體,那算是解決問題)
          3、如果很不幸掉進(jìn)了簡體中文,不要害怕,在它下載安裝包的過程中,按下crtl+alt+F2,調(diào)到其他工作界面,常用字符節(jié)目的應(yīng)該都很熟悉,然后用ps aux查看那里是apt-get的程序進(jìn)程,找到pid,把它kill掉就ok了。它就會(huì)進(jìn)入后續(xù)安裝,馬上就要有系統(tǒng)界面了!!有了節(jié)目,大家都有種感覺,踏實(shí)了,linux平安到布~~~


          近期鬧得火紅的小日本B+數(shù)據(jù)庫tokyocabinet(以下簡稱tc),性能確實(shí)不容置疑,但是安裝卻老是出問題,問題都出自于一大堆的依賴錯(cuò)誤。要搞定確實(shí)折騰!主要問題是tc要依賴bzip2,還有l(wèi)ibbz2這個(gè)linux常規(guī)壓縮工具。說是常規(guī),但是ubuntu,opensuse常規(guī)是不會(huì)安裝的。搞不懂,哪來常規(guī)。
          也許常規(guī)是對Radhat而言的,我用5.3企業(yè)版的radhat不會(huì)出現(xiàn)這種麻煩事。
          因?yàn)楣ぞ咛R?guī)所以一般人不會(huì)注意問題所在,更有看過,網(wǎng)上認(rèn)為這是tokyocabinet一個(gè)bug。

          言歸正傳,說說具體問題吧。
          問題:
          1、tc make file時(shí)候,當(dāng)碰到依賴libbz2.a或者libz.a這兩個(gè)庫的時(shí)候會(huì)出現(xiàn)編譯錯(cuò)誤。
          諸如:
           缺少zlib.h這個(gè)文件
          //******************************************************************************************************************************//
          /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] 錯(cuò)誤 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] 錯(cuò)誤 1
          //******************************************************************************************************************************//

          凡是這兩個(gè)問題,很重要一個(gè)原因是bzip的開發(fā)依賴包沒有裝好,或者沒裝。
          首先要下載這兩個(gè)安裝包
          1、bzip2-1.0.4.tar.gz
          2、zlib-1.2.3.tar.gz

          我上網(wǎng)找過很多解決方法。但是問題依舊,依然編譯不過去。
          即使用了ubuntu的apt-get install libbz2-dev。。。
          網(wǎng)上一般都是修改bzip源碼包的Makefile文件。(裝個(gè)小東西,知識一定要豐富!)

          網(wǎng)上的解決方法:
          在gcc編譯參數(shù)中加入-fPIC(對于該參數(shù),我在備注中有解釋,適合菜鳥級c語言用戶理解)
          但是問題,有時(shí)后就只刁難你,還是不怎么奏效。

          我總結(jié)了一下方法:
          1、注意順序問題:(這三個(gè)東西一環(huán)扣一環(huán),真麻煩)
          如果發(fā)現(xiàn) libbz2.a: could not read symbols: Bad value
          就應(yīng)該把/usr/local/lib中的libbz2.a刪掉
          進(jìn)入解壓縮的zlib-1.2.3目錄,用make clean命令清理一下。
          同樣,/usr/local/lib/libz.a: could not read symbols
          操作同上,刪掉libz.a,把bzip2-1.0.4目錄的編譯文件清理一下。
          如果找不到這兩個(gè)文件的位置,可以在終端敲上:
          find -name libbz2.a
          ....

          2.修改zlib-1.2.3的Makefile文件
          把gcc的編譯參數(shù)加上 -fPIC
          原文:CFLAGS=-O3 -DUSE_MMAP
          修改為:CFLAGS=-O3 -DUSE_MMAP -fPIC
          如果還是過不去,勸你硬來CC=gcc 直接后面跟上-fPIC讓他們?nèi)开?dú)立編譯
          重申:如果你之前編譯過了,一定要用make clean清掉,否則還是徒勞。。
          最后make 還有 make install

          3.修改bzip2-1.0.4的Makefile文件
          CC=gcc -fPIC  《===這個(gè)就是我發(fā)飆的結(jié)果,全部讓他 -fPIC
          AR=ar
          RANLIB=ranlib
          LDFLAGS=

          BIGFILES=-D_FILE_OFFSET_BITS=64
          CFLAGS=-fPIC -Wall -Winline -O2 -g $(BIGFILES)  《===當(dāng)然這里也可以加上

          同樣,bzip2有一個(gè)Makefile-libbz2_so的文件,編譯時(shí)會(huì)調(diào)用,當(dāng)然你也可以單個(gè)編譯:
          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
          估計(jì)應(yīng)該修復(fù)了一些bug。
          make clean
          make
          當(dāng)輸出:
          #================================================================
          # 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參數(shù)解釋:
          -fpic
          原文:Position independant code, needed for shared libraries.
          我的理解:獨(dú)立編譯代碼,需要共享苦支持(菜鳥級譯法)
          -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.
          我的理解:這兩個(gè)參數(shù)的不同在于,下面這個(gè)是總會(huì)執(zhí)行,上面小寫的只提供更小的對象文件編譯。

           

          (摘自:163博客,http://liuziheng5726.blog.163.com ,我的舊博客~~)


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

          評論

          # re: libbz2.a,libz.so導(dǎo)致tokyocabinet make失敗問題解決方法  回復(fù)  更多評論   

          2014-08-09 01:43 by 閆興茂
          我是php編譯失敗的時(shí)候遇到的問題,終于找到了,找了好幾天,謝謝博主

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 福鼎市| 镇巴县| 屯昌县| 南昌县| 香格里拉县| 庆阳市| 类乌齐县| 罗田县| 炉霍县| 石嘴山市| 汽车| 汉川市| 留坝县| 波密县| 盐池县| 玛沁县| 河池市| 宜章县| 安达市| 寿阳县| 玉林市| 长寿区| 湖南省| 龙海市| 灌云县| 黔南| 黄龙县| 沈丘县| 汝阳县| 揭西县| 赤城县| 武胜县| 弋阳县| 吉木乃县| 洪洞县| 鄱阳县| 灌阳县| 营山县| 惠州市| 秭归县| 竹山县|