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端的界面變化:
同樣,可以同時開啓多個客戶端!