前言:
  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. 编写如下代码进行编译/运行认证

 #include <iostream>
#include <string>
#include <boost/regex.hpp>
int main()
{
boost::regex pattern("\\w+@\\w+(\\.\\w+)*");
std::string mail("xxx@gmail.com"); if ( boost::regex_match(mail, pattern) ) {
std::cout << mail << " is a valid mail address!" << std::endl;
} else {
std::cout << mail << " is not a valid mail address!" << std::endl;
}
}

  安装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添加如下行:

 #ifdef WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
#include <io.h>
#include <tchar.h>
#endif

  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代码编译/运行成功
 #include <event.h>
#include <stdio.h> int main()
{
const char *version = event_get_version();
printf("%s\n",version);
return ;
}
    附加依赖项: 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的调用采用全局声明的那个函数

 assert.h

 #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

 #define assert(_Expression) (void)( (!!(_Expression)) || (::_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
    
    测试验证:
    编写 hello.thrift 文件
 namespace cpp test

 service HelloService {
string hello(: string username);
}
  thrift.exe -gen cpp hello.thrift 
 // : , HelloService.cpp
// : , HelloService.h
// : , HelloService_server.skeleton.cpp
// : hello_constants.cpp
// : hello_constants.h
// : hello_types.cpp
// : hello_types.h 
    编译执行, 遇到10093错误, 如何去解决?
    WSANOTINITIALISED,  which means WSAStartup() has not been called yet.
    编译完成后运行时会报WSAStartup错误    
    解决方案:
    http://hi.baidu.com/fsx92/item/9f7a96efd33f9f1b585dd88c                  
    编写测试case
  服务端代码:
 class HelloServiceHandler : virtual public HelloServiceIf {
public:
HelloServiceHandler() {
// Your initialization goes here
} void hello(std::string& _return, const std::string& username) {
_return = "hello " + username;
} }; int main(int argc, char **argv) {
int port = ; TWinsockSingleton::create(); // 需要用户自己添加, 进行WSAStartup的初始化, 算是windows 版的thrift的一个疏忽 shared_ptr<HelloServiceHandler> handler(new HelloServiceHandler());
shared_ptr<TProcessor> processor(new HelloServiceProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
return ;
}
    客户端代码 
 #include "HelloService.h"
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/transport/TSocket.h> using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server; using boost::shared_ptr; using namespace ::test; int main()
{ shared_ptr<TTransport> socket(new TSocket("127.0.0.1", ));
shared_ptr<TTransport> transport(new TBufferedTransport(socket));
shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); HelloServiceClient client(protocol); try {
transport->open();
std::string res;
client.hello(res, "lilei");
std::cout << res << std::endl;
} catch(TException &e) {
std::cout << e.what() << std::endl;
} return ;
}
    推荐做法:
    对依赖库的整理, 这是一个好的习惯
    每个库单独创建一个头文件目录, 和库文件目录, 所有的库统一在同一个库仓库下,  c++的库管理不如java的maven那么方便, 又进入一个石器时代, 库的维护需要开发者手动去支持, 但这是种很好的工程实践.     
    
    repository目录为顶级的仓库目录, 以boost为例, boost表示库名, 之下boost/1.55.0为boost的具体的某一版本, 而boost/0.55.0/include为这个版本的头文件目录, boost/0.55.0/lib为这个版本的lib库目录

thrift在windows的编译/安装--c++版的更多相关文章

  1. RPC与实践(thrift在windows的编译/安装--c++版)

    ------------------------------------------------------------------------ RPC 功能目标 RPC 的主要功能目标是让构建分布式 ...

  2. Apache Thrift 在Windows下的安装与开发

    Windows下安装Thrift框架的教程很多.本文的不同之处在于,不借助Cygwin或者MinGW,只用VS2010,和Thrift官网下载的源文件,安装Thrift并使用. 先从官网 下载这两个文 ...

  3. N2N windows下编译安装文件

    n2n安装 n2n原理编译版下载,可直接使用:windows下vpn客户端 n2n_v2_linux_x64 n2n_v2_Win32TAP网卡驱动 #linux环境编译yum install -y ...

  4. Windows下编译安装 FFmpeg

    在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在wind ...

  5. ubuntu14.04 编译安装CPU版caffe

      本文,试图中一个干净的ubuntu14.04机器上安装caffe的cpu版本. http://blog.csdn.net/sinat_35188997/article/details/735304 ...

  6. windows下编译安装BOOST

    boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...

  7. ubuntu thrift 0.9.3编译安装

    Table of Contents 1. 下载thrift源代码 2. 编译并安装 3. 运行测试程序 4. 安装 1 下载thrift源代码 git clone https://git-wip-us ...

  8. Windows Server 2016 安装虚拟机版黑群晖

    硬件配置 Dell R730 CPU: Intel(R) Xeon(R) CPU E5-2603 v4 @1.70GHz(6 cores) Ram: 16Gb HDD: 系统-600GB SAS X2 ...

  9. windows VS2013 编译安装QWT6.1和QWTPolar1.1.1

    QWT的编译和配置 1. 下载QWT从官网 For getting a snapshot with all bugfixes for the latest 5.2 release: svn expor ...

随机推荐

  1. Android 主页面顶部栏的通知Notification ,可以自定义通知消息栏的风格,并且点击通知栏进人本程序。

    常用的程序通知,显示到主页面的顶部栏. package com.lixu.tongzhi; import android.app.Activity; import android.app.Notifi ...

  2. CSS最常用和实用的技巧

    1.重置浏览器的字体大小重置浏览器的默认值 ,然后重设浏览器的字体大小你可以使用雅虎的用户界面重置的CSS方案 ,如果你不想下载9MB的文件,代码如下: body,div,dl,dt,dd,ul,ol ...

  3. HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点   源点 到行连流量为 所给的 ...

  4. 兼容 IE,firfox 的时间日期出现 NaN

      //当前日期加上天数后的新日期.function AddDays(days) { var d = new Date(); var year = d.getFullYear(); var day = ...

  5. HDU 1203-Program D

    Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的 ...

  6. SharedPreference 存储小量数据,一般首次启动显示引导界面就用这个。

    写://添加一个SharedPreference并传入数据SharedPreference sharedPreferences = getSharedPreferences("share_d ...

  7. hadoop版本和位数的查看方法

    目前针对apache hadoop更新的版本较多,由此而产生了两个方面的问题: 1.如何查看运行的集群当中的hadoop的版本的问题. 2.如何查看运行集群当中的hadoop的位数 下面详细的介绍一下 ...

  8. 您不能在64-位可执行文件上设置DEP属性?

    我是为dllhost.exe设置DEP时遇到了同样的情况.你需要选择64位系统对应的程序.64位系统:C:\Windows\SysWOW64\dllhost.exe32位系统:C:\Windows\S ...

  9. 【LeetCode OJ】Gas Station

    Problem link: http://oj.leetcode.com/problems/gas-station/ We can solve this problem by following al ...

  10. iOS ARC和MRC混编

    如果一个工程为MRC,其中需要添加ARC的文件: 选择target  ->  build phases  ->  compile sources  ->单击ARC的文件将compil ...