本篇是Thrift官網安裝文檔的翻譯,原地址點擊這裏。Thrift之前是不支持Windows的。但是似乎0.9版本以後已經支持Window了。介紹了Thrift安裝的環境要求以及在centos,Debian/Ubuntu,OS X和Windows下的安裝過程。並提出了一些安裝過程中可能遇到的問題和解決辦法。適用於thrift0.9版本。
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 #示例指南目錄