天天看點

thrift在windows的編譯/安裝--c++版

前言:

  thrift是出于facebook的rpc網絡程式設計架構, 其對跨平台和多語言的支援優于google protobuf,

但thrift在java/c#語言上應用比較多, 資料也豐富, 在windows平台的c++這塊, 資料相對較少, 而且編譯也麻煩.

這篇部落客要記錄對thrift在windows上的編譯和使用過程, 不涉及原理, 也不具體涉及應用.如有不足, 請各位指正.

執行過程

1. 下載下傳并安裝visual studio

notice: visual studio 有windows版本限制, 比如visual

studio 2013在windows 7就安裝不了

參考網址:

http://www.visualstudio.com/zh-cn/visual-studio-2013-compatibility-vs

系統: windows7

+ visual studio 2012

2. boost安裝/編譯/連結

  具體步驟如下:

  *) 下載下傳boost

    1. 下載下傳

boost_1_55_0.zip

  *) 編譯boost

    1. 執行 bootstrap.bat

    2. 執行 b2.exe

(編譯的時間較長, 請耐心等待)

  *) 驗證boost

    在virtual studio的window

console工程屬性中添加如下:

    1. 附加包含目錄: $boost_home

    2. 附加庫目錄:

$boost_home\stage\lib

    3. 編寫如下代碼進行編譯/運作認證

  安裝boost和配置visual studio的參考網址如下所示:

  http://blog.csdn.net/stanfordzhang/article/details/8587282

  http://www.cnblogs.com/me115/archive/2010/10/08/1845825.html

  http://www.cnblogs.com/chuncn/archive/2012/09/10/2679026.html

3. libevent的編譯/安裝/連結

  *) 參考的編譯/安裝過程網頁

  http://blog.s135.com/libevent_windows/

  *)

下載下傳libevent

  http://libevent.org/

  *) 編譯libevent

  遇到的編譯錯誤處理方案

  http://10305101ivy.blog.163.com/blog/static/584765892012227322607/

  http://blog.csdn.net/boyxiaolong/article/details/17057063

  evutil.c添加如下行:

  nmake /f makefile.nmake

  生成libevent_core.lib libevent_extras.lib

libevent.lib

  若遇到頭檔案找不到的問題, 需要手動修改makefile.nmake檔案, 添加相關的頭檔案路徑

cflags=/iwin32-code /iinclude /icompat /dwin32 /dhave_config_h

/i. /i"c:\program files

(x86)\windows kits\8.0\include\um" /i"c:\program files (x86)\windows

kits\8.0\include\shared" /i"c:\program files (x86)\microsoft visual studio

11.0\vc\include"

    具體添加的原則是編譯缺那個頭檔案, 就去添加相關的系統頭檔案目錄

    編寫libevent代碼編譯/運作成功

    附加依賴項: ws2_32.lib , libevent_core.lib

,libevent.lib, libevent_extras.lib

4. thrift的編譯/連結

  *)下載下傳thrift 0.9.0源碼

  下載下傳網址:

http://archive.apache.org/dist/thrift

  *)thrift依賴的庫

  http://www.coder4.com/archives/3777

  thrift 依賴 boost庫(1.4.7), thriftnb 依賴

boost/libevent庫

  http://www.iteye.com/problems/87958

  thrift在編譯過程中,

會遇到二義性

  “_wassert”: 對重載函數的調用不明确

  void _wassert(const wchar_t

*,const wchar_t *,unsigned int)

  void

apache::thrift::protocol::_wassert(const wchar_t *,const wchar_t *,unsigned

int)

  解決方案:

  這算指令空間污染的問題, 添加::,

使得對_wassert的調用采用全局聲明的那個函數

    測試驗證:

    編寫 hello.thrift 檔案

  thrift.exe -gen cpp hello.thrift 

    編譯執行, 遇到10093錯誤, 如何去解決?

    wsanotinitialised,  which means wsastartup() has not

been called yet.

  編譯完成後運作時會報wsastartup錯誤 

    解決方案:

  http://hi.baidu.com/fsx92/item/9f7a96efd33f9f1b585dd88c 

    編寫測試case

  服務端代碼:

    用戶端代碼 

    推薦做法:

    對依賴庫的整理, 這是一個好的習慣

    每個庫單獨建立一個頭檔案目錄, 和庫檔案目錄, 所有的庫統一在同一個庫倉庫下,

 c++的庫管理不如java的maven那麼友善, 又進入一個石器時代, 庫的維護需要開發者手動去支援, 但這是種很好的工程實踐.  

thrift在windows的編譯/安裝--c++版
thrift在windows的編譯/安裝--c++版

    repository目錄為頂級的倉庫目錄, 以boost為例, boost表示庫名,

之下boost/1.55.0為boost的具體的某一版本, 而boost/0.55.0/include為這個版本的頭檔案目錄,

boost/0.55.0/lib為這個版本的lib庫目錄