天天看点

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库目录