windows下安装配置Thrift
2016-05-14 12:42
417 查看
本篇是Thrift官网安装文档的翻译,原地址点击这里。Thrift之前是不支持Windows的。但是似乎0.9版本以后已经支持Window了。介绍了Thrift安装的环境要求以及在centos,Debian/Ubuntu,OS X和Windows下的安装过程。并提出了一些安装过程中可能遇到的问题和解决办法。适用于thrift0.9版本。
Apache的Thrift的编译器为支持可移植由C++语言编写而成。但在安装到某些系统中时要求有一定的环境要求。在下面的指南中选择你要安装的系统开始吧。
Centos 6.5 Install
Debian/Ubuntu install
OS X Install
Windows Install
一个相对posix兼容* NIX系统
Windows下可用的Cywin或者MinGW
g++ 4.2
boost 1.53.0
生成编译器时还需要支持lex和yacc的运行时库
GNU的编译工具:
autoconf 2.65
automake 1.9
libtool 1.5.24
pkg-config autoconf macros (pkg.m4)
lex and yacc (开发主要使用flex和bison)
libssl-dev
只选择编译你需要的语言的库就可以了
C++
Boost 1.53.0
libevent (可选,编译无阻塞服务器时使用)
zlib (可选)
Java
Java 1.7
Apache Ant
C#: Mono 1.2.4 (可使用 pkg-config 检测) or Visual Studio 2005+
Python 2.6 (包括扩展模块的头文件)
PHP 5.0 (包括扩展模块的头文件)
Ruby 1.8
bundler gem
Erlang R12 (可以使用R11,但是不推荐)
Perl 5
Bit::Vector
Class::Accessor
进行Thrift的最小化安装,在Centos 6.5 上下面的步骤必不可少. 我们给出使用当前开发的主分支来从源代码编译Thrift的例子。这些介绍对Thrift0.9.2 的 releases版本同样有效。
所有语言都要用到Apache的Thrift 的IDL编译器,从这点看IDL编译器需要的一切都要安装。 (如何你只需要安装编译器可跳过此节).
如果你要使用C++开发Thrift的客户端/服务器,你还需要编译支持C++共享库的可选包。
上述步骤将构建编译器(thrift/compiler/cpp/thrift --version)以及任意语言库的支持。当使用
在基于Linux的Debian/Ubuntu等系统下安装Thrift需要安装下面要求的工具和库。
接下来可以安装Java的JDK.输入java查看可用的包列表,选择并安装并使用apt-get安装。
Debian稳定的用户需要手动安装最近automake版本:
其他包取决于你希望THrift支持什么语言.
Ruby
ruby-full ruby-dev ruby-rspec rake rubygems libdaemons-ruby libgemplugin-ruby mongrel
Python
python-all python-all-dev python-all-dbg
Perl
libbit-vector-perl libclass-accessor-class-perl
Php, install
php5-dev php5-cli phpunit
C_glib
libglib2.0-dev
Erlang
erlang-base erlang-eunit erlang-dev
Csharp
mono-gmcs mono-devel libmono-system-web2.0-cil nunit nunit-console
Haskell
ghc6 cabal-install libghc6-binary-dev libghc6-network-dev libghc6-http-dev
Thrift Compiler for Windows
mingw32 mingw32-binutils mingw32-runtime nsis
在基与OS X的系统下安装Thrift需要安装下面要求的工具和库。
从boost.org上下载boost库并解压,编译
下载libevent并解压,编译
下载Apache Thrift 最新版本并解压,编译
我们已经语言生成了一个windows下的thrift编译器,点击这里下载
Thrift的编译器为支持可移植,使用C++语言编写,但是仍有一些环境要求:
Cygwin or MinGW
Apache Thrift 环境要求(参看第一节)
Thrift的运行库由多种语言写成,这些语言有不同的语言接口。
如果是第一次编译源码,需要生成configure脚本。(因此无需全量下载安装包)。进入安装包的根目录,运行
一旦configure脚本生成,Thrift就可以编译了。运行
由于编译报错PTHREAD_MUTEX_RECURSIVE_NP未定义,需要设置环境变量CXXFLAGS,用PTHREAD_MUTEX_RECURSIVE替换PTHREAD_MUTEX_RECURSIVE_NP。(在cygwin 20100320, Thrift r760184, 最新的 pthread上测试通过。)
可选部分: 由于以下错误你可以不用在根目录编译Thrift的编译器。在make前跳转到编译器的目录
现在可用make来生成编译器了(如果在根目录make的话还会生成运行时库)
一些语言包必须使用构建工具手动安装(在撰写本文时,适用于Java,Ruby,PHP).
每种语言的库的详细安装步骤可以阅读
另见MinGW安装时的可能可选的问题.
运行
要解决这个问题,需要找到系统中的pkg.m4 (由pkg-config 安装包安装)文件并复制的
最后,在运行
(注意,pkg.m4由pkg-config 工具生成.如果你的目录
安装Perl库附带chmod的时候可能会出现错误。一个解决方法是如果不需要它们话安装perl库时避免安装它们。
如果你不需要Perl,可以运行
如果你需要Perl,你最好在安装完Thrift后,用下面的内容替换
使用g++链接已安装的libthrift.a时可能会出现错误,Thrift 类找不到虚函数表(vtables)和异常(exceptions).
解决方法是将丢失的类直接链接到编译后的目标文件。在MakeFile可以使用下面语句实现
然后使用$(LTHRIFT) 而不是-lthrift链接。
当你是g++-3编译器编译你的Thrift 的C++程序时,fork() 之后可能出现段错误。
这个问题在 Cygwin的邮件列表已经有描述 http://cygwin.com/ml/cygwin/2010-05/msg00203.html.
这个问题在 Cygwin 1.7.5-1之后的版本或者g++ 4.5.0之后已经修复.
安装MinGW (www.mingw.org)后,编译Thrift的编译器和运行时库(未测试)不再需要依赖cygwin.dll。你只需要按照下面的步骤进行即可。
添加Windows环境变量PATH
接着,打开文件
运行脚本
确保环境变量
运行
可选:如果只生成编译器的话,可以调整到编译器所在目录
运行 make:
另见 使用Cygwin安装可能出现的问题,包括关于 PTHREAD_MUTEX_RECURSIVE_NP的描述。
保证在Makefile的cxxflags添加-lfl,或者尝试添加-Lc:/cygwin/libs
尝试改变头文件的路径,编辑
修改为
在Makefile中给CXXDEFS变量添加
最后看看Thrift的源代码组织结构
1 Thrift的环境要求
Apache的Thrift的编译器为支持可移植由C++语言编写而成。但在安装到某些系统中时要求有一定的环境要求。在下面的指南中选择你要安装的系统开始吧。Centos 6.5 Install
Debian/Ubuntu install
OS X Install
Windows Install
1.1 基本环境要求
一个相对posix兼容* NIX系统Windows下可用的Cywin或者MinGW
g++ 4.2
boost 1.53.0
生成编译器时还需要支持lex和yacc的运行时库
1.2 编译源码的环境要求
GNU的编译工具:autoconf 2.65
automake 1.9
libtool 1.5.24
pkg-config autoconf macros (pkg.m4)
lex and yacc (开发主要使用flex和bison)
libssl-dev
1.3 语言要求
只选择编译你需要的语言的库就可以了C++
Boost 1.53.0
libevent (可选,编译无阻塞服务器时使用)
zlib (可选)
Java
Java 1.7
Apache Ant
C#: Mono 1.2.4 (可使用 pkg-config 检测) or Visual Studio 2005+
Python 2.6 (包括扩展模块的头文件)
PHP 5.0 (包括扩展模块的头文件)
Ruby 1.8
bundler gem
Erlang R12 (可以使用R11,但是不推荐)
Perl 5
Bit::Vector
Class::Accessor
2 Centos 6.5 下安装Thrift
进行Thrift的最小化安装,在Centos 6.5 上下面的步骤必不可少. 我们给出使用当前开发的主分支来从源代码编译Thrift的例子。这些介绍对Thrift0.9.2 的 releases版本同样有效。
更新系统
sudo yum -y update
安装平台开发工具
sudo yum -y groupinstall "Development Tools"
升级autoconf/automake/bison
sudo yum install -y wget
升级 autoconf
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz tar xvf autoconf-2.69.tar.gz cd autoconf-2.69 ./configure --prefix=/usr make sudo make install cd ..
升级 automake
wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz tar xvf automake-1.14.tar.gz cd automake-1.14 ./configure --prefix=/usr make sudo make install cd ..
升级 bison
wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz tar xvf bison-2.5.1.tar.gz cd bison-2.5.1 ./configure --prefix=/usr make sudo make install cd ..
添加添加可选的c++语言库依赖库
所有语言都要用到Apache的Thrift 的IDL编译器,从这点看IDL编译器需要的一切都要安装。 (如何你只需要安装编译器可跳过此节).如果你要使用C++开发Thrift的客户端/服务器,你还需要编译支持C++共享库的可选包。
安装C++依赖库
sudo yum -y install libevent-devel zlib-devel openssl-devel
升级 Boost
wget http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz tar xvf boost_1_55_0.tar.gz cd boost_1_55_0 ./bootstrap.sh sudo ./b2 install
编译Thrift的IDL编译器
git clone https://git-wip-us.apache.org/repos/asf/thrift.git cd thrift ./bootstrap.sh ./configure --with-lua=no make sudo make install
上述步骤将构建编译器(thrift/compiler/cpp/thrift --version)以及任意语言库的支持。当使用
make来安装时的路径为:
/usr/local/bin/thrift.你可以使用
./configure --enable-libs=no切换来编译IDL编译器,而不编译语言库。使用
make check可以运行测试用例.
3 Debian/Ubuntu 下安装Thrift
在基于Linux的Debian/Ubuntu等系统下安装Thrift需要安装下面要求的工具和库。sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev
接下来可以安装Java的JDK.输入java查看可用的包列表,选择并安装并使用apt-get安装。
Debian稳定的用户需要手动安装最近automake版本:
wget http://ftp.debian.org/debian/pool/main/a/automake-1.14/automake_1.14.1-3_all.deb sudo dpkg -i automake_1.14.1-3_all.deb
可选包
其他包取决于你希望THrift支持什么语言.Ruby
ruby-full ruby-dev ruby-rspec rake rubygems libdaemons-ruby libgemplugin-ruby mongrel
Python
python-all python-all-dev python-all-dbg
Perl
libbit-vector-perl libclass-accessor-class-perl
Php, install
php5-dev php5-cli phpunit
C_glib
libglib2.0-dev
Erlang
erlang-base erlang-eunit erlang-dev
Csharp
mono-gmcs mono-devel libmono-system-web2.0-cil nunit nunit-console
Haskell
ghc6 cabal-install libghc6-binary-dev libghc6-network-dev libghc6-http-dev
Thrift Compiler for Windows
mingw32 mingw32-binutils mingw32-runtime nsis
4 OS X 下安装Thrift
在基与OS X的系统下安装Thrift需要安装下面要求的工具和库。
安装Boost
从boost.org上下载boost库并解压,编译./bootstrap.sh sudo ./b2 threading=multi address-model=64 variant=release stage install
安装libevent
下载libevent并解压,编译./configure --prefix=/usr/local make sudo make install
安装 Apache Thrift
下载Apache Thrift 最新版本并解压,编译./configure --prefix=/usr/local/ --with-boost=/usr/local --with-libevent=/usr/local
5 Windows下安装Thrift
我们已经语言生成了一个windows下的thrift编译器,点击这里下载
5.1 Windows下源码安装
win32的基本要求
Thrift的编译器为支持可移植,使用C++语言编写,但是仍有一些环境要求:Cygwin or MinGW
Apache Thrift 环境要求(参看第一节)
Thrift的运行库由多种语言写成,这些语言有不同的语言接口。
源码安装
如果是第一次编译源码,需要生成configure脚本。(因此无需全量下载安装包)。进入安装包的根目录,运行./bootstrap.sh
一旦configure脚本生成,Thrift就可以编译了。运行
export CXXFLAGS="-D PTHREAD_MUTEX_RECURSIVE_NP=PTHREAD_MUTEX_RECURSIVE" ./configure
由于编译报错PTHREAD_MUTEX_RECURSIVE_NP未定义,需要设置环境变量CXXFLAGS,用PTHREAD_MUTEX_RECURSIVE替换PTHREAD_MUTEX_RECURSIVE_NP。(在cygwin 20100320, Thrift r760184, 最新的 pthread上测试通过。)
可选部分: 由于以下错误你可以不用在根目录编译Thrift的编译器。在make前跳转到编译器的目录
cd compiler/cpp
现在可用make来生成编译器了(如果在根目录make的话还会生成运行时库)
make make install
一些语言包必须使用构建工具手动安装(在撰写本文时,适用于Java,Ruby,PHP).
每种语言的库的详细安装步骤可以阅读
lib/<language>/目录下READMI文件。
Cygwin安装时的可能可选的问题
另见MinGW安装时的可能可选的问题.
语言错误(Syntax error in ./configure)
运行./configure可能出现以下错误:
./configure: line 21183: syntax error near unexpected token `MONO,' ./configure: line 21183: ` PKG_CHECK_MODULES(MONO, mono >= 1.2.6, have_mono=yes, have_mono=no)'
要解决这个问题,需要找到系统中的pkg.m4 (由pkg-config 安装包安装)文件并复制的
thrift/aclocal目录下。在Thrift的根目录时可以运行下面的命令
cp /usr/share/aclocal/pkg.m4 aclocal
最后,在运行
./bootstrap.sh和
./configure。
(注意,pkg.m4由pkg-config 工具生成.如果你的目录
/usr/share/aclocal下没有pkg.m4文件,说明你可能没有安装pkg-config.)
安装perl的运行时库
安装Perl库附带chmod的时候可能会出现错误。一个解决方法是如果不需要它们话安装perl库时避免安装它们。如果你不需要Perl,可以运行
configure时加入选项 --without-perl.
如果你需要Perl,你最好在安装完Thrift后,用下面的内容替换
thrift/lib/perl/Makefile的内容后手动安装。
TODO
安装C++运行库时的连接
使用g++链接已安装的libthrift.a时可能会出现错误,Thrift 类找不到虚函数表(vtables)和异常(exceptions).解决方法是将丢失的类直接链接到编译后的目标文件。在MakeFile可以使用下面语句实现
THRIFT_O=<path to>/thrift/lib/cpp LTHRIFT=$(THRIFT_O)/Thrift.o $(THRIFT_O)/TSocket.o $(THRIFT_O)/TBinaryProtocol.o $(THRIFT_O)/TBufferTransports.o
然后使用$(LTHRIFT) 而不是-lthrift链接。
TODO - diagnose issue further
使用 cygwin 1.7.5-1, g++-4.3.4, fork() and throw 时出现C++运行时段错误
当你是g++-3编译器编译你的Thrift 的C++程序时,fork() 之后可能出现段错误。这个问题在 Cygwin的邮件列表已经有描述 http://cygwin.com/ml/cygwin/2010-05/msg00203.html.
这个问题在 Cygwin 1.7.5-1之后的版本或者g++ 4.5.0之后已经修复.
5.2 源码安装 (不依赖Cygwin)
安装MinGW (www.mingw.org)后,编译Thrift的编译器和运行时库(未测试)不再需要依赖cygwin.dll。你只需要按照下面的步骤进行即可。添加Windows环境变量PATH
C:\MINGW\BIN
接着,打开文件
compiler/cpp/Makefile.am,添加下面一行内容到
thrift_CXXFLAGS:
-DMINGW -mno-cygwin -lfl
运行脚本
bootstrap.sh:
./bootstrap.sh
确保环境变量
$PATH中包含java,如果没有的话,可以运行
export PATH=$PATH:"/cygdrive/c/program files/java/jre1.6.0_05/bin"
运行
configure,使用CXXFLAGS解决旧线程的定义问题
export CXXFLAGS="-D PTHREAD_MUTEX_RECURSIVE_NP=PTHREAD_MUTEX_RECURSIVE" ./configure
可选:如果只生成编译器的话,可以调整到编译器所在目录
cd compiler/cpp
运行 make:
mingw32-make.exe
使用MinGW安装可能出现的问题
另见 使用Cygwin安装可能出现的问题,包括关于 PTHREAD_MUTEX_RECURSIVE_NP的描述。
yywrap 未找到
保证在Makefile的cxxflags添加-lfl,或者尝试添加-Lc:/cygwin/libs
boost 未找到
尝试改变头文件的路径,编辑compiler/cpp/Makefile,查找
BOOST_CPPFLAGS,
修改为
BOOST_CPPFLAGS = -Ic:/cygwin/usr/include/boost-1_33_1
realpath 未找到
在Makefile中给CXXDEFS变量添加-DMINGW -mno-cygwin
THrift源代码组织
最后看看Thrift的源代码组织结构--/thrift ----/compiler #编译器源码 ----/doc #文件 ----/lib #框架库源码 ----/test #测试用例目录 ----/tutorial #示例指南目录
相关文章推荐
- 教你学会Android的NDK开发
- 重定位表的添加/编辑/删除工具
- Spark集群配置
- 玩转ptrace(二)
- hbase-0.98.19在centos下面编译
- JavaScript常用内置对象及其相应属性和方法(一)
- label的文字描边
- Hibernate 4.3 注解映射
- Hive SQL的编译过程
- uva10652 Board Wrapping(凸包)
- 美国匿名议员:操控一个幼稚绵羊组成的国家太容易了
- [从头学声学] 第215节 音符的研究
- hdu 2087 剪花布条(KMP)
- What happened if i delete a pointer which was not allocated dynamically?
- 获取字符串的utf-16编码
- What happened if i delete a pointer which was not allocated dynamically?
- 第10、11周项目(2)-储存班长信息的学生类
- 理解环境变量
- 用递归方法求n!
- amazon 出栈 进栈 序列 题目