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端的界面变化:
同样,可以同时开启多个客户端!