業界兩大RPC框架thrift(Facebook)和protobuf(Google)現在可是用的非常普遍,linux上編譯thrift遇到不少坑,記下來供有需要的朋友參考。
編譯
系統環境:
- 操作系統爲CentOS 6.5
- g++版本4.4(要求必須g++版本 >= 4.2)
下載:
- http://thrift.apache.org/download
- 當前編譯的版本爲thrift-0.12.0.tar.gz
先說正常流程,基本上就是參考官網流程來:
- 1.開發庫全套
sudo yum -y groupinstall "Development Tools"
- 2.幾個編譯工具和庫
-
- 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 ..
-
- flex
sudo yum -y install flex
-
- c++ library
sudo yum -y install libevent-devel zlib-devel openssl-devel
-
- Boost
wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz
tar xvf boost_1_53_0.tar.gz
cd boost_1_53_0
./bootstrap.sh
sudo ./b2 install
- 3.thrift編譯安裝
git clone https://github.com/apache/thrift.git
cd thrift
./bootstrap.sh
./configure --with-lua=no
make
sudo make install
本機上如果對應庫已經安裝且版本比這高就不用安裝了,這一套流程走下來,編譯安裝沒問題,那就不用往下看了,如果有問題對照如下解決即可。
問題
- 提示少庫,yum安裝對應庫後再編譯
- ./src/thrift/server/TNonblockingServer.h:41:33: error: event2/event_compat.h: No such file or directory
這種情況是缺少的對應的庫,libevent-devel只是安裝了開發所需的頭文件庫而已,如下安裝
wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
tar xvf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
./configure --prefix=/usr/local
make
make install
- ‘apache::thrift::transport::THeaderTransport’ does not have any field named ‘TVirtualTransport’
這種情況是g++版本太低,不支持對應的模板語法,如下到文件./thrift/lib/cpp/src/thrift/transport/THeaderTransport.h,把THeaderTransport對應的兩個構造函數模板參數補齊即可
/// Use default buffer sizes.
explicit THeaderTransport(const stdcxx::shared_ptr<TTransport>& transport)
: TVirtualTransport<THeaderTransport, TFramedTransport>(transport),
...
}
THeaderTransport(const stdcxx::shared_ptr<TTransport> inTransport,
const stdcxx::shared_ptr<TTransport> outTransport)
: TVirtualTransport<THeaderTransport, TFramedTransport>(inTransport),
...
}
下載
CentOS 6.5 上已編譯好thrift下載鏈接
原創,轉載請註明來自