Thrift安裝[轉載]

 

說明:

    可能是用windows時間長的關係,總感覺linux下的軟件管理很麻煩。

    特意說明下:這裏的方法非原創,都是在安裝過程中遇到問題在搜索之後的整理。作爲一種經驗整理。

 

·安裝:

  依賴庫:

基本:--應該是最小集,但我安裝這些後還是缺少庫。

  libboost-dev,libevent-dev,libtool,flex,bison,g++,automake,pkg-config,

  libboost-test-dev

  libmono-dev,ruby1.8-dev,libcommons-lang-java,php5-dev

全部:

  debhelper(>=5),build-essential,mono-gmcs,python-dev,ant,

  libmono-dev,erlang-base,ruby1.8-dev,autoconf,python-support,

  automake,pkg-config,libtool,bison,flex,liboost-dev|libboost1.40-dev,

  python-all,python-all-dev,python-all-dbg,ruby,

  openjdk-6-jdk|java-sdk,libcommons-lang-java,

  libboost-test-dev|libboost-test1.40-dev,libevent-dev,

  perl(>=5.8.0-7),php5,php5-dev

補充:

  我自己還看別的資料安裝了appache ivy,不知道有沒有影響。

  下載地址:

 一般都是自己上網搜索,去官網直接下載最好。不過還是附上地址:http://thrift.apache.org/

  步驟:

0.在舊資料中的第一步是運行./bootstrap.sh的腳本,不過新版本(0.80)可略過;

1.執行腳本:./configure --without-erlang –with-boost=/usr/include

              (其中./configure也可以有其他的參數)

2.sudo make(因爲我是安裝在/opt下的)

3.sudo make install

·問題:

  關於boost安裝:

因爲我原先學習使用boost了,所以我安裝的全套的boost庫。

  關於erlang問題:

因爲我在make的過程中總是在處理erlang過程出現問題,而我也沒找到相關的解決方法,考慮到暫時先不用erlang,就關閉了erlang功能--使用參數without-erlang。

  uint32等類型不識別問題:

深層的原因不知道,不過在TProtocol.h中有個#ifdef HAVE_NETINET_IN_H後跟#include <netinet/in.h>和#endif的語句塊,這樣的話默認不識別uint16_t等類型的。解決方法有兩個:

  (推薦)在g++後加參數-DHAVE_NETINET_IN_H。

  (慎重)直接修改TProtocol.h等源代碼。

我採用的是第一種方法。

網上其他資料:

  g++編譯時加入下列宏定義即可。

  COMMON_DEF=-DHAVE_NETINET_IN_H -DHAVE_INTTYPES_H

  詳細見:https://issues.apache.org/jira/browse/THRIFT-1326

  動態庫鏈接問題:

在編譯正確後,運行程序時系統提示:error while loading shared libraries: libthrift0.8.0.so: cannot open shared object file: No such file or directory。。。的錯誤。解決方法有兩個:

(我採用)修改配置文件:在~/.bashrc里加上export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/lib,之後用ldconfig命令是配置生效。

原文:

  因爲要使thrift,昨天和Makefile搏鬥了一晚上,編譯的時候加了-I$thrift_path,鏈接的時候加了-lthrift,好容易編譯過了,結果運行的時候報了error while loading shared libraries: libthrift.so.0: cannot open shared object file: No such file or directory。。。
    解決方法:在~/.bashrc里加上export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/lib/,總算搞定了。。還是找root在/etc/ld.so.conf里加一下?搞不清呀。。。
    thrift還是挺方便的。。。
以下爲zz:
linux中與動態庫連接的程序在運行時,需要將該動態庫加載到內存中,linux根據LD_LIBRARY_PATH查找動態庫,默認的動態庫文件目錄 爲/usr/local/lib, /usr/lib。如果動態庫沒有位於默認目錄中,或環境變量設置錯誤,都會引起錯誤,提示爲:
       error while loading shared libraries: libxxx.xx: cannot open shared object file: No such file or directory

解決辦法:修改加對應的環境變量,然後再執行。

export LD_LIBRARY_PATH=動態庫所在目錄:$LD_LIBRARY_PATH
linux程序運行時加載共享庫出現的錯誤:
"error while loading shared libraries: xxxx: cannot open shared object file: No such file or directory"
解決步驟:
1、使用find命令查找缺失的xxxx共享庫文件所在位置。參考:#find 目錄 -name "xxxx*"
2、將找到的目錄位置寫入 /etc/ld.so.conf 配置文件,這個文件記錄了編譯時使用的動態鏈接庫的路徑。
3、然後使用ldconfig命令,使配置生效。
注:使用 ldd 命令查看程序運行需要哪些庫。 該命令用於判斷某個可執行的 binary 檔案含有什麼動態函式庫。該命令是一個shell腳本,不是程序。

 

  網上看到的問題但個人還沒遇到:

  第二: undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const'

         這也是存在的一個源碼的bug,在protocol/TBinaryProtocol.h中,有兩條語句

          static const int32_t

          這時,想到前面出現的問題,只要改成 static const uint32_t,問題就解決了

3. 還有一點需要注意的就是,在一個編譯命令中,遇到來一個非常奇怪的問題,一直沒有找到合適的解決方法,後來發現把-lthrift放在給g++的最後就可以解決了,後來理解到原因可能是後面還有內容需要依賴於thrift庫,而把他放在前面,後面對庫的依賴就找不到來。。

   可以看出g++後面參數的順序和位置對程序的編譯和執行的影響還是挺大的。

官方的使用教程和事例

http://wiki.apache.org/thrift/ThriftUsageC%2B%2B

·例子:

聲明:原博客地址http://blog.csdn.net/hbuxiaoshe/article/details/6558391

我用的是c++,所以我舉一個c++的例子,簡單說一下thrift的使用入門。

例子描述是這樣的:我們將學生信息(學號,姓名,性別,年齡)由客戶端發送到服務端。

實現這個例子,我們大致要做以下幾部分事情:

(1)書寫.thrift文件

(2)生成cpp文件

(3)編寫客戶端

(4)編譯cpp文件並執行

(1)書寫.thrift文件

學生信息是有結構的,所以我們使用thrift的struct即可,爲了達到通信的目的,我們必須使用service。

所以最後書寫成的student.thrift文件內容如下:

struct Student{
1: i32 sno,
2: string sname,
3: bool ssex,
4: i16 sage,
}
service Serv{
void put(1: Student s),
}

(2)生成cpp文件

生成cpp文件很簡單,只需要一個thrift命令即可:

/home/xiaoshe/opt/bin/thrift -r --gen cpp student.thrift

--gen 後指定生成的語言,生成的cpp存儲在目錄gen-cpp下

命令執行後,將會在./gen-cpp/目錄下生成如下文件:

Serv.cpp

Serv.h

Serv_server.skeleton.cpp

student_constants.cpp

student_constants.h

student_types.cpp

student_types.h

注意文件的大小寫:

Serv開頭的文件是由service生成的,這個關鍵字很重要,下面還會見到以它開頭的類。

student是根據student.thrift文件的名生成的。

這些文件可以進行編譯,生成最初的服務端。

(3)編寫客戶端

使用thrift命令後,我們並沒有得到我們想要的客戶端client源代碼,因此客戶端程序要由我們自己編寫實現。然而很幸運,我們可以使用下面的代碼段來編寫我們client程序:

[c-sharp] view plaincopy

  1. #include "Serv.h"  // 替換成你的.h
  2. #include <transport/TSocket.h>
  3. #include <transport/TBufferTransports.h>
  4. #include <protocol/TBinaryProtocol.h>
  5. using namespace apache::thrift;  
  6. using namespace apache::thrift::protocol;  
  7. using namespace apache::thrift::transport;  
  8. using boost::shared_ptr;  
  9. int main(int argc, char **argv) {  
  10.     boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));  
  11.     boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));  
  12.     boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));  
  13.     transport->open();  
  14. // 我們的代碼寫在這裏
  15.     transport->close();  
  16. return 0;  

保存成文件client.cpp

(4)編譯cpp文件並執行

編譯服務端:g++ -g -I/home/xiaoshe/opt/include/thrift -L/home/xiaoshe/opt/lib/ -lthrift Serv.cpp student_types.cpp student_constants.cpp Serv_server.skeleton.cpp -o server

編譯客戶端:g++ -g -I/home/xiaoshe/opt/include/thrift -L/home/xiaoshe/opt/lib/ -lthrift -lm -pthread -lz -lrt -lssl Serv.cpp student_types.cpp student_constants.cpp client.cpp -o client

運行服務端:./server

運行客戶端:./client

(5)傳輸我們的數據Student信息

到此客戶端已經連上了服務端,但服務端只有這樣的響應(No more data to read),因爲二者之間還沒有數據交互。

我們把客戶端當做發送端,修改client.cpp向服務端發送數據。

在“// 我們的代碼寫在這裏”

寫下我們的代碼:

// 先創建一個Student類型的變量,Student是我們在student.thrift中定義過的

Student s;
s.sno = 123;
s.sname = "xiaoshe";
s.ssex = 1;
s.sage = 30;

// 再定義一個對象client,又是以"Serv"開頭的類

ServClient client(protocol);

// 最後調用put函數向服務端傳輸數據, put是student.thrift採用service定義的成員函數。

// 調用put後,服務端也調用相應的put()
client.put(s);

服務端負責接收數據,也做相應修改:

在類ServHandler()的put()中:

printf("sno=%d sname=%s ssex=%d sage=%d/n", s.sno, s.sname.c_str(), s.ssex, s.sage);

最後編譯,運行服務端,啓動客戶端後,服務端收到消息,顯示結果爲:

put
sno=123 sname=xiaoshe ssex=1 sage=30

至此,客戶端已能向服務端發送數據了。

發佈了3 篇原創文章 · 獲贊 14 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章