日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Thrift安裝及遇到問題并附帶一個(gè)例子

系統(tǒng) 2029 0

?

說明:

??? 可能是用windows時(shí)間長的關(guān)系,總感覺linux下的軟件管理很麻煩。

??? 特意說明下:這里的方法非原創(chuàng),都是在安裝過程中遇到問題在搜索之后的整理。作為一種經(jīng)驗(yàn)整理。

?

·安裝:

? 依賴庫:

基本:--應(yīng)該是最小集,但我安裝這些后還是缺少庫。

? 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

補(bǔ)充:

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

? 下載地址:

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

? 步驟:

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

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

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

2.sudo make(因?yàn)槲沂前惭b在/opt下的)

3.sudo make install

·問題:

? 關(guān)于boost安裝:

因?yàn)槲以葘W(xué)習(xí)使用boost了,所以我安裝的全套的boost庫。

? 關(guān)于erlang問題:

因?yàn)槲以趍ake的過程中總是在處理erlang過程出現(xiàn)問題,而我也沒找到相關(guān)的解決方法,考慮到暫時(shí)先不用erlang,就關(guān)閉了erlang功能--使用參數(shù)without-erlang。

? uint32等類型不識別問題:

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

? (推薦)在g++后加參數(shù)-DHAVE_NETINET_IN_H。

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

我采用的是第一種方法。

網(wǎng)上其他資料:

? g++編譯時(shí)加入下列宏定義即可。

? COMMON_DEF=-DHAVE_NETINET_IN_H -DHAVE_INTTYPES_H

? 詳細(xì)見:https://issues.apache.org/jira/browse/THRIFT-1326

? 動(dòng)態(tài)庫鏈接問題:

在編譯正確后,運(yùn)行程序時(shí)系統(tǒng)提示:error while loading shared libraries: libthrift0.8.0.so: cannot open shared object file: No such file or directory。。。的錯(cuò)誤。解決方法有兩個(gè):

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

原文:

? 因?yàn)橐箃hrift,昨天和Makefile搏斗了一晚上,編譯的時(shí)候加了-I$thrift_path,鏈接的時(shí)候加了-lthrift,好容易編譯過了,結(jié)果運(yùn)行的時(shí)候報(bào)了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中與動(dòng)態(tài)庫連接的程序在運(yùn)行時(shí),需要將該動(dòng)態(tài)庫加載到內(nèi)存中,linux根據(jù)LD_LIBRARY_PATH查找動(dòng)態(tài)庫,默認(rèn)的動(dòng)態(tài)庫文件目錄 為/usr/local/lib, /usr/lib。如果動(dòng)態(tài)庫沒有位于默認(rèn)目錄中,或環(huán)境變量設(shè)置錯(cuò)誤,都會(huì)引起錯(cuò)誤,提示為:
?????? error while loading shared libraries: libxxx.xx: cannot open shared object file: No such file or directory

解決辦法:修改加對應(yīng)的環(huán)境變量,然后再執(zhí)行。

export LD_LIBRARY_PATH=動(dòng)態(tài)庫所在目錄:$LD_LIBRARY_PATH
linux程序運(yùn)行時(shí)加載共享庫出現(xiàn)的錯(cuò)誤:
"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 配置文件,這個(gè)文件記錄了編譯時(shí)使用的動(dòng)態(tài)鏈接庫的路徑。
3、然后使用ldconfig命令,使配置生效。
注:使用 ldd 命令查看程序運(yùn)行需要哪些庫。 該命令用于判斷某個(gè)可執(zhí)行的 binary 檔案含有什么動(dòng)態(tài)函式庫。該命令是一個(gè)shell腳本,不是程序。

?

? 網(wǎng)上看到的問題但個(gè)人還沒遇到:

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

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

????????? static const int32_t

????????? 這時(shí),想到前面出現(xiàn)的問題,只要改成 static const uint32_t,問題就解決了

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

?? 可以看出g++后面參數(shù)的順序和位置對程序的編譯和執(zhí)行的影響還是挺大的。

官方的使用教程和事例

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

·例子:

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

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

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

實(shí)現(xiàn)這個(gè)例子,我們大致要做以下幾部分事情:

(1)書寫.thrift文件

(2)生成cpp文件

(3)編寫客戶端

(4)編譯cpp文件并執(zhí)行

(1)書寫.thrift文件

學(xué)生信息是有結(jié)構(gòu)的,所以我們使用thrift的struct即可,為了達(dá)到通信的目的,我們必須使用service。

所以最后書寫成的student.thrift文件內(nèi)容如下:

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

(2)生成cpp文件

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

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

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

命令執(zhí)行后,將會(huì)在./gen-cpp/目錄下生成如下文件:

Serv.cpp

Serv.h

Serv_server.skeleton.cpp

student_constants.cpp

student_constants.h

student_types.cpp

student_types.h

注意文件的大小寫:

Serv開頭的文件是由service生成的,這個(gè)關(guān)鍵字很重要,下面還會(huì)見到以它開頭的類。

student是根據(jù)student.thrift文件的名生成的。

這些文件可以進(jìn)行編譯,生成最初的服務(wù)端。

(3)編寫客戶端

使用thrift命令后,我們并沒有得到我們想要的客戶端client源代碼,因此客戶端程序要由我們自己編寫實(shí)現(xiàn)。然而很幸運(yùn),我們可以使用下面的代碼段來編寫我們client程序:

[c-sharp] view plain copy

  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;??
  17. }?

保存成文件client.cpp

(4)編譯cpp文件并執(zhí)行

編譯服務(wù)端: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

運(yùn)行服務(wù)端:./server

運(yùn)行客戶端:./client

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

到此客戶端已經(jīng)連上了服務(wù)端,但服務(wù)端只有這樣的響應(yīng)(No more data to read),因?yàn)槎咧g還沒有數(shù)據(jù)交互。

我們把客戶端當(dāng)做發(fā)送端,修改client.cpp向服務(wù)端發(fā)送數(shù)據(jù)。

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

寫下我們的代碼:

// 先創(chuàng)建一個(gè)Student類型的變量,Student是我們在student.thrift中定義過的

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

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

ServClient client(protocol);

// 最后調(diào)用put函數(shù)向服務(wù)端傳輸數(shù)據(jù), put是student.thrift采用service定義的成員函數(shù)。

// 調(diào)用put后,服務(wù)端也調(diào)用相應(yīng)的put()
client.put(s);

服務(wù)端負(fù)責(zé)接收數(shù)據(jù),也做相應(yīng)修改:

在類ServHandler()的put()中:

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

最后編譯,運(yùn)行服務(wù)端,啟動(dòng)客戶端后,服務(wù)端收到消息,顯示結(jié)果為:

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

至此,客戶端已能向服務(wù)端發(fā)送數(shù)據(jù)了。

Thrift安裝及遇到問題并附帶一個(gè)例子


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 正阳县| 松阳县| 确山县| 华池县| 定州市| 磐安县| 宿州市| 吴旗县| 台中县| 乐业县| 时尚| 嘉祥县| 扎赉特旗| 南陵县| 萨嘎县| 永济市| 汝城县| 会理县| 繁峙县| 永春县| 湘阴县| 崇信县| 花莲市| 牙克石市| 连江县| 崇义县| 浦城县| 壶关县| 东乌珠穆沁旗| 景谷| 区。| 九龙县| 九龙坡区| 西华县| 岢岚县| 株洲县| 方山县| 沙坪坝区| 东光县| 长寿区| 策勒县|