前言:
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那麼友善, 又進入一個石器時代, 庫的維護需要開發者手動去支援, 但這是種很好的工程實踐.
repository目錄為頂級的倉庫目錄, 以boost為例, boost表示庫名,
之下boost/1.55.0為boost的具體的某一版本, 而boost/0.55.0/include為這個版本的頭檔案目錄,
boost/0.55.0/lib為這個版本的lib庫目錄