1. thrift的安裝,不容小視,他需要依賴很多的庫和工具,尤其是boost等工具都需要源碼安裝,所以嚴格按照官網上的信息,一步一步執行就可以來。
http://thrift.apache.org/download/
有兩個問題需要注意: 1. 安裝過程無需./bootstrap這個過程,本來就沒有這個文件
2.Apache要求安裝之後認證,可以在svn上面下一個KYES完成認證過程;
2. thrift安裝完成之後,可以通過一個實例來熟悉他的使用過程。要感謝xiaoshe朋友的博客http://blog.csdn.net/hbuxiaoshe/article/details/6558391,給我提供了一個完整的學習樣例。該博客中寫的非常清晰。
有幾個需要注意的問題:
thrift本身是一個開源的軟件,它一直處於開發過程中,難免出現一些bug,下面是我遇到的幾個bug;
第一: 在運行編譯thrift生成的服務器端程序時,出現
error: ‘uint8_t’ does not name a type
error: ‘uint32_t’ does not name a type
這個問題一開始的確讓我很迷茫,難道使用thrift生成代碼的同時,還需要手動添加各種頭文件嗎,這個問題看起來很簡單,只要手工在各個相關文件中加入stdint.h頭文件就可以,不過這個要求很匪夷所思。
後來在網上查找,找到了這個問題的解決方法,在TProtocol.h中有這樣的語句:#ifdef HAVE_NETINET_IN_H的預處理命令,而且後面就是我們想要的頭文件。
因此在g++之後,加上參數 --DHAVE_NETINET_IN_H實現變量聲明,就可以解決這個問題。我的理解是現在thrift存在的一個問題,或者直接修改TProtocol.h不過,我不建議這樣做。
第二: 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