thrift安裝說明(Windows下CYGWIN)

  

1、  /安裝Cygwin:選擇using IE5,否則下載不了對應的包;由於thrift需要的包很多,包含常用的boost、libtool 等,所以爲了方便,將All Package改爲所有安裝,即將Default點擊變爲Install,不過這樣要下載安裝一段時間,需要耐心。

2、  安裝好Cygwin,默認已經包含了Thrift需要的大部分包,具體包含以下必須的安裝包:

GNU build tools (autoconf 2.60, automake 1.10, libtool 1.5.24)

boost 1.33.1+

g++ 4.0+

bison 2.3-1

boost 1.33.1-4

boost-devel 1.33.1-4

flex 2.5.33-1

pkgconfig

libtool

3、  安裝JAVA編譯JAR包所需的ANT包,以及Thrift Java所需的slf4j以及libevent,其中後者主要是用於提供設置服務器爲non-blocking server,這樣對於高併發訪問有重要的幫助。

4、  首先安裝ANT包,首先下載,這裏我們用的是apache-ant-1.8.1-bin.tar,我把這個包首先放到了/usr/local/bin 目錄下面,然後先解壓該文件:tar –zxcf apache-ant-1.8.1-bin.tar

然後把apache-ant-1.8.1-bin.tar這個壓縮文件放到/usr/local/src,主要是方便管理。接着系統可執行路徑中加入指向ant的bin的路徑就可以了,主要是修改/etc/profile文件,修改如下:

export ANT_HOME=/usr/local/bin/apache-ant-1.8.1

export PATH=/usr/local/bin/apache-ant-1.8.1/bin:$PATH

其中的路徑要根據自己的包所放的位置進行設置。

然後爲了生效該profile文件,需要執行:source /etc/profile

這樣便安裝好,執行ant,便會有如下提示,表明已經安裝好。

5、  對於slf4j,首先從網上下載,我這裏下載的是slf4j-1.6.1.tar.gz,然後解壓縮:tar –zxvf slf4j-1.6.1.tar.gz,然後把該包也放到/usr/local/src,方便管理。其中該包在安裝完Thrift後,編譯JAVA所需的Thrift靜態庫libthrift.a所必需的,後面會詳細說明。

6、  安裝libevent,首先從網上下載,這裏用的是libevent-1.4.14b-stable.tar.gz。先解壓縮:tar –zxvf libevent-1.4.14b-stable.tar.gz,然後進入該解壓縮的文件目錄,執行以下命令:

./configure –prefix=/usr

Make

Make install

執行完後,可以執行下面命令測試是否安裝成功。

 會出現以下結果,表明安裝成功,並在/lib目錄下面會有libevent.la等相關的靜態庫。

7、安裝Thrift,詳細參考:http://wiki.apache.org/thrift/ThriftInstallationWin32

首先解壓縮thrift,這裏我們用的是thrift-0.3.0版本,tar –zxvf thrift.tar.gz。

進入thrift-0.3.0目錄,執行:./bootstrap.sh

生成環境對應的配置的腳本文件,然後執行:

export CXXFLAGS="-D PTHREAD_MUTEX_RECURSIVE_NP=PTHREAD_MUTEX_RECURSIVE"

這個很重要,不然在編譯Thrift C++庫文件的時候,會提示:PTHREAD_MUTEX_RECURSIVE_NP沒有申明。

然後執行:./configure

這個需要一段時間,耐心等待命令執行完成。

再執行:

cd compiler/cpp

make

make install

執行完以上命令,下面通過:thrift,命令,便可以測試是否安裝成功。如果有如下提示,表明已經安裝成功!

8、配置JAVA 的thrift環境,進入thrift-0.3.0目錄下面的lib/java目錄,然後執行ant,會在該目錄下面生成libthrift.jar文件。其中最後會提示build successful,在目錄下面會自動多了個libthrift.jar。

9、編譯設置JAVA Thrift環境,進入tutorial目錄,

Cd /tutorial/

執行:

Thrift --gen java tutorial.thrift

Thrift –gen java shared.thrift

在該目錄下面會自動生成gen-java目錄,然後進入JAVA 目錄,由於官網的JAVA 源程序是錯誤的,我是請了朋友改動的,具體改什麼地方,我沒怎麼問!同樣,那個build.xml:

<project name="tutorial" default="tutorial" basedir=".">

    <property name="src" location="src" />

    <property name="gen" location="../gen-java" />

    <property name="build" location="build" />

    <property name="build.src" location="build/build.src" />

    <property name="build.sysclasspath" value="ignore"/>

   

    <path id="cpath">

       <fileset dir="../../lib/java">

           <include name="*.jar"/>

       </fileset>

    </path>

   

    <target name="init" depends="clean">

       <mkdir dir="${build}"/>

       <copy todir="${build.src}">

            <fileset dir="${src}">

            </fileset>

        </copy>

       <copy todir="${build.src}">

           <fileset dir="${gen}">

            </fileset>

        </copy>

    </target>

 

    <target name="compile" depends="init">

       <javac srcdir="${build.src}" destdir="${build}">

           <classpath refid="cpath"/>

       </javac>

    </target>

 

    <target name="tutorial" depends="compile">

       <jar jarfile="tutorial.jar" basedir="${build}"/>

    </target>

 

    <target name="clean">

       <delete dir="${build}" />

       <delete file="tutorial.jar" />

       <delete file="${build.src}" />

    </target>

 

</project>

其中主要是庫的設置,這裏需要把剛纔的slf4j,把那個文件夾下面的slf4j-api-1.6.1.jar、slf4j-jdk14-1.6.1.jar、slf4j-log4j12-1.6.1.jar、slf4j-simple-1.6.1.jar。複製到/lib/java目錄下面。

<fileset dir="../../lib/java">

<include name="*.jar"/>

</fileset>

設置完之後,執行:ant

會自動在該目錄下面生成build目錄,下面會有JavaClient.class以及JavaServer.class.輸出如下:

gpuserver@gpuserver-PC /usr/local/bin/thrift-0.3.0/tutorial/java

$ ant

Buildfile: C:\cygwin\usr\local\bin\thrift-0.3.0\tutorial\java\build.xml

 

clean:

   [delete] Deleting directory C:\cygwin\usr\local\bin\thrift-0.3.0\tutorial\jav

a\build

 

init:

    [mkdir] Created dir: C:\cygwin\usr\local\bin\thrift-0.3.0\tutorial\java\buil

d

     [copy] Copying 2 files to C:\cygwin\usr\local\bin\thrift-0.3.0\tutorial\jav

a\build\build.src

     [copy] Copying 7 files to C:\cygwin\usr\local\bin\thrift-0.3.0\tutorial\jav

a\build\build.src

 

compile:

    [javac] Compiling 9 source files to C:\cygwin\usr\local\bin\thrift-0.3.0\tut

orial\java\build

    [javac] 注意:某些輸入文件使用或覆蓋了已過時的 API。

    [javac] 注意:要了解詳細信息,請使用 -Xlint:deprecation 重新編譯。

 

tutorial:

      [jar] Building jar: C:\cygwin\usr\local\bin\thrift-0.3.0\tutorial\java\tut

orial.jar

BUILD SUCCESSFUL

Total time: 1 second

 

 

這樣整個JAVA Thrift環境就配置起來!

 

10、Thrift C++環境配置:

首先也是要配置LIB,進入lib/cpp目錄,直接執行make

則會出現下面的錯誤提示:

提示malloc和free函數沒有申明,則打開thrift.cpp文件,在頭文件下面添加:

#include <malloc.h>

然後保存,在執行剛纔的命令。執行過程中會生成很多.o和.la文件,在該目錄的.libs目錄下面,會看到libthrift.a這樣的文件,表明該靜態庫已經生成!

由於想要利用動態庫 libthrift.so,還需要執行make install,這樣會自動生成對應的動態庫.

 

11、測試Thrift C++的例子,進入tutorial目錄:

Cd /tutorial/

執行:

Thrift --gen cpp tutorial.thrift

Thrift –gen cpp shared.thrift

在該目錄下面會自動生成gen-cpp目錄,然後進入cpp目錄,

執行make,那麼會出現很多錯誤,主要是環境的設置,具體要修改makefile文件!

修改如下:

BOOST_DIR = /usr/include/boost/

THRIFT_DIR = /usr/local/bin/thrift-0.3.0/

LIB_DIR = /lib

GEN_SRC = ../gen-cpp/SharedService.cpp ../gen-cpp/shared_types.cpp ../gen-cpp/tutorial_types.cpp ../gen-cpp/Calculator.cpp

THRIFT_O=$(THRIFT_DIR)/lib/cpp

LTHRIFT=$(THRIFT_O)/Thrift.o $(THRIFT_O)/TSocket.o $(THRIFT_O)/TBinaryProtocol.o $(THRIFT_O)/TBufferTransports.o $(THRIFT_O)/TServerSocket.o $(THRIFT_O)/TSimpleServer.o $(THRIFT_O)/TApplicationException.o

 

default: server client

 

server: CppServer.cpp

    g++ -o CppServer -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR} $(LTHRIFT) CppServer.cpp ${GEN_SRC}

 

client: CppClient.cpp

    g++ -o CppClient -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR} $(LTHRIFT) CppClient.cpp ${GEN_SRC}

 

clean:

    $(RM) -r CppClient CppServer

 

其中原因詳細見:http://wiki.apache.org/thrift/ThriftInstallationWin32

Linking to installed C++ runtime libraries:

Sometimes, the installed libthrift.a will not link using g++, with linker errors about missing vtables and exceptions for Thrift classes.

A workaround is to link the compiled object files directly from your Thrift build, corresponding to the missing classes.

This can be implemented in a Makefile using the following lines:

        THRIFT_O=<path to>/thrift/lib/cpp
        LTHRIFT=$(THRIFT_O)/Thrift.o $(THRIFT_O)/TSocket.o $(THRIFT_O)/TBinaryProtocol.o $(THRIFT_O)/TBufferTransports.o

Then linking using $(LTHRIFT) instead of -lthrift.

TODO - diagnose issue further

同時要設置下默認的thrift include目錄,將lib/cpp/src,將該目錄下面的thrift頭文件均拷貝到tutorial/gen-cpp目錄下面,然後執行make

則會在/tutorial/cpp目錄下面生成CppClient.exe以及CppServer.exe。

 

執行該程序:

./CppServer

則會出現如下界面:

然後在本地在開一個cygwin,然後進入到剛纔的目錄,執行./CppClient

界面如下:

同樣可以看到對應的剛纔的Server端的界面變化:

同樣,可以同時開啓多個客戶端!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章