Win7+VS2013初试Thrift

win7环境下VS2013编译boost_1_58_0步骤:

  1. 官网下载boost_1_58_0(直接下载),解压
  2. cmd窗口cd到boost_1_58_0,执行bootstrap.bat
  3. cmd窗口获取动态库命令:bjam install stage --toolset=msvc-12.0 -- stagedir="C:Boostoost_vc_120" link=shared runtime-link=shared threading=multi debug release                                                                                                   cmd窗口获取静态库命令:bjam install stage --toolset=msvc-12.0 -- stagedir="C:Boostoost_vc_120" link=static runtime-link=static threading=multi debug release
  4. cmd窗口运行:b2 install
  5. 完毕后会在C:Boost目录下生成include和lib两个目录,其中lib目录和include目录下boost-1_58这两个目录为编译成功后得到的两个目录
  6. 新建Win32 Console Application项目,Console application+Empty project,去掉Precomplied header前面的勾。
  7. 工程上右键Properties,C++里的General,Additional Include Directiories添加boost-1_58目录
  8. Linker里的General,Additional Library Directories添加lib目录
  9. 添加source.cpp,代码如下,编译,如果成功代表boost编译成功
 1 #include <iostream>  
 2 #include <boost/thread/thread.hpp>  
 3 
 4 void hello()
 5 {
 6     std::cout << "Hello world, I'm a thread!" << std::endl;
 7 }
 8 int main()
 9 {
10     boost::thread thrd(&hello);
11     thrd.join();
12 }

win7环境下VS2013编译libevent-2.0.22-stable步骤:

  1. 官网下载libevent-2.0.22-stable(使用git)
  2. 修改以下三个文件libevent-2.0.22-stableevent_iocp.c,libevent-2.0.22-stableevthread_win32.c,libevent-2.0.22-stablelistener.c,在这三个文件开头添加宏定义#define _WIN32_WINNT 0x0500
  3. Microsoft visual studio 2013命令行工具,cd到levent-libevent目录,执行nmake /f Makefile.nmake
  4. 编译成功后,在当前目录会生成三个lib,分别为:libevent_core.lib,libevent_extras.lib和libevent.lib
  5. 新建一个lib目录,将这三个lib文件拷贝到此目录;新建一个include目录,将libevent-2.0.22-stableinclude目录下的文件和文件夹拷贝到此目录下,将libevent-2.0.22-stableWIN32-Code下的文件和libevent-2.0.22-stableWIN32-Code make下的目录和文件拷贝到此目录下,2个event2目录下的文件直接合并即可
  6. 新建Win32 Console Application项目,Console application+Empty project,去掉Precomplied header前面的勾。
  7. 工程上右键Properties,VC++ Directories里的Include Directories添加include目录,Library Directories添加lib目录
  8. C++里的Code Generation,Runtime Library选择Multi-threaded Debug (/MTd)(Debug下),Multi-threaded (/MT)(Release下)
  9. Linker里的Input,Additional Dependencies添加ws2_32.lib;wsock32.lib;libevent.lib;libevent_core.lib;libevent_extras.lib;
  10. 添加source.cpp,代码如下,启动项目,打开cmd输入(需要在控制面板打开windows功能中勾选telnet客户端):telnet 127.0.0.1 55555,效果图如下:

Win7+VS2013初试Thrift

source.cpp源码如下:

  1 #include <string.h>
  2 #include <errno.h>
  3 #include <stdio.h>
  4 #include <signal.h>
  5 
  6 #ifndef WIN32
  7 #include <netinet/in.h>
  8 # ifdef _XOPEN_SOURCE_EXTENDED
  9 #  include <arpa/inet.h>
 10 # endif
 11 #include <sys/socket.h>
 12 #endif
 13 
 14 #include "event2/bufferevent.h"
 15 #include "event2/buffer.h"
 16 #include "event2/listener.h"
 17 #include "event2/util.h"
 18 #include "event2/event.h"
 19 
 20 #include <WinSock2.h>
 21 
 22 static const char MESSAGE[] = "Hello, World!
";
 23 
 24 static const int PORT = 9995;
 25 
 26 
 27 static void conn_writecb(struct bufferevent *bev, void *user_data)
 28 {
 29     struct evbuffer *output = bufferevent_get_output(bev);
 30     if (evbuffer_get_length(output) == 0) 
 31     {
 32         printf("flushed answer
");
 33         bufferevent_free(bev);
 34     }
 35 }
 36 
 37 static void conn_eventcb(struct bufferevent *bev, short events, void *user_data)
 38 {
 39     if (events & BEV_EVENT_EOF) 
 40     {
 41         printf("Connection closed.
");
 42     } 
 43     else if (events & BEV_EVENT_ERROR) 
 44     {
 45         printf("Got an error on the connection: %s
",
 46             strerror(errno));/*XXX win32*/
 47     }
 48     /* None of the other events can happen here, since we haven't enabled
 49      * timeouts */
 50     bufferevent_free(bev);
 51 }
 52 
 53 static void signal_cb(evutil_socket_t sig, short events, void *user_data)
 54 {
 55     struct event_base *base = (struct event_base *)user_data;
 56     struct timeval delay = { 2, 0 };
 57 
 58     printf("Caught an interrupt signal; exiting cleanly in two seconds.
");
 59 
 60     event_base_loopexit(base, &delay);
 61 }
 62 
 63 static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd,
 64     struct sockaddr *sa, int socklen, void *user_data)
 65 {
 66     struct event_base *base = (struct event_base *)user_data;
 67     struct bufferevent *bev;
 68 
 69     bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
 70     if (!bev) 
 71     {
 72         fprintf(stderr, "Error constructing bufferevent!");
 73         event_base_loopbreak(base);
 74         return;
 75     }
 76     bufferevent_setcb(bev, NULL, conn_writecb, conn_eventcb, NULL);
 77     bufferevent_enable(bev, EV_WRITE);
 78     bufferevent_disable(bev, EV_READ);
 79 
 80     bufferevent_write(bev, MESSAGE, strlen(MESSAGE));
 81 }
 82 
 83 int main(int argc, char **argv)
 84 {
 85     struct event_base *base;
 86     struct evconnlistener *listener;
 87     struct event *signal_event;
 88 
 89     struct sockaddr_in sin;
 90 
 91 #ifdef WIN32
 92     WSADATA wsa_data;
 93     WSAStartup(0x0201, &wsa_data);
 94 #endif
 95 
 96     base = event_base_new();
 97     if (!base) 
 98     {
 99         fprintf(stderr, "Could not initialize libevent!
");
100         return 1;
101     }
102 
103     memset(&sin, 0, sizeof(sin));
104     sin.sin_family = AF_INET;
105     sin.sin_port = htons(PORT);
106 
107     listener = evconnlistener_new_bind(base, listener_cb, (void *)base,
108         LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1,
109         (struct sockaddr*)&sin,
110         sizeof(sin));
111 
112     if (!listener) 
113     {
114         fprintf(stderr, "Could not create a listener!
");
115         return 1;
116     }
117 
118     signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)base);
119 
120     if (!signal_event || event_add(signal_event, NULL)<0) 
121     {
122         fprintf(stderr, "Could not create/add a signal event!
");
123         return 1;
124     }
125 
126     event_base_dispatch(base);
127 
128     evconnlistener_free(listener);
129     event_free(signal_event);
130     event_base_free(base);
131 
132     printf("done
");
133     return 0;
134 }

win7环境下VS2013编译openssl步骤:

  1. 下载安装ActivePerl,官网下载openssl源码(使用git,若在官网上下载压缩包解压会出现错误<不知道为什么?>)
  2. Microsoft visual studio 2013命令行工具,cd到openssl目录
  3. 执行命令:perl Configure VC-WIN32 no-asm --prefix=c:openssl_lib
  4. 执行命令:msdo_ms
  5. 执行命令:nmake -f ms tdll.mak (编译动态库)                                                                                                         nmake -f ms t.mak    (编译静态库)
  6. 执行命令:nmake -f ms tdll.mak install (装载动态库)                                                                                                 nmake -f ms t.mak install    (装载静态库)
  7. 执行命令:nmake -f ms tdll.mak test   (测试动态库)                                                                                                 nmake -f ms t.mak test      (测试静态库)
  8. openssl目录下的include和lib即为编译成功后得到的两个目录
  9. 新建Win32 Console Application项目,Console application+Empty project,去掉Precomplied header前面的勾。
  10. 工程上右键Properties,C++里的General,Additional Include Directiories添加include目录
  11. Linker里的General,Additional Library Directories添加lib目录
  12. 添加source.cpp,代码如下,启动项目
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #include <time.h>
     5 #include <openssl/bn.h>
     6 #include <openssl/ec.h>
     7 #include <openssl/rand.h>
     8 #include <openssl/err.h>
     9 #include <openssl/ecdsa.h>
    10 #include <openssl/ecdh.h>
    11 
    12 #pragma comment(lib, "libeay32.lib")
    13 
    14 int main()
    15 {
    16 
    17     return 0;
    18 }

win7环境下VS2013编译thrift步骤:

  1. 下载thrift-0.9.2(本人使用git下载源码包)
  2. 打开thrift-0.9.2libcpp下的sln项目,按照上文所述步骤依次为两个项目(libthrift和libthriftnb,两种模式)添加boost、libevent和openssl依赖项,编译Solution即可得到这两种模式下对应的lib文件(分别为libthrift.lib和libthriftnb.lib)和一个src目录。(注意debug版本和release版本需要分别添加,在solution上右键Properties的Configuration上改变编译方式,分别编译可得到这两种版本对于的四个lib文件)

初试thrift:

  1. 下载thrift-0.9.2.exe,更名为thrift.exe,准备运行源码包里的cpp例程(在thrift-0.9.2 utorial目录下,包括shared.thrift、tutorial.thrift和thrift-0.9.2 utorialcpp目录下的CppClient.cpp和CppServer.cpp)
  2. 新建目录ThriftCreateCode,将thrift.exe放入,将shared.thrift和tutorial.thrift这两个文件拷贝到当前目录,cmd窗口cd到ThriftCreateCode,依次执行命令:thrift --gen cpp shared.thrift和thrift --gen cpp tutorial.thrift(这两个命令部分先后),将会在当前目录下产生gen-cpp,此目录下将会产生多个.h和.cpp文件,如下图(其中两个_server.skeleton.cpp为给的示例server代码,供参考):
  3. Win7+VS2013初试Thrift
  4. 新建Solution,取名为ThriftCPPTest,并新建两个Win32 Console Application项目,Console application+Empty project,去掉Precomplied header前面的勾,分别为Client和Server。
  5. 分别为Client和Server添加thrift依赖项:工程上右键Properties,VC++ Directories里的Include Directories添加src目录,Library Directories添加lib目录(包含debug或者release里的两个lib文件);C++里的Code Generation,Runtime Library选择Multi-threaded Debug (/MTd)(Debug下),Multi-threaded (/MT)(Release下);Linker里的Input,Additional Dependencies添加libthrift.lib;libthriftnb.lib;
  6. 分别为Client和Server添加Boost依赖项
  7. 分别为Client项目和Server项目添加相对应的.h和.cpp文件,添加的文件和运行效果见下图:
  8. Win7+VS2013初试Thrift

  最后我想说一句,对这些开源项目,真特么是操蛋,网上资料很杂,一种一种的试,我真是醉了。

  本文参考资料:

  win7环境下VS2013编译boost_1_58_0:http://jingyan.baidu.com/article/a3aad71aa1ebe7b1fb009681.html

  win7环境下VS2013编译libevent-2.0.22-stable步骤:http://www.cnblogs.com/luxiaoxun/p/3603399.html

    http://zengwu3915.blog.163.com/blog/static/2783489720153402449305/

  win7环境下VS2013编译openssl:http://blog.csdn.net/liuhongxiangm/article/details/18400837

    http://blog.sina.com.cn/s/blog_55feec4101010x51.html

  thrift初试:http://blog.csdn.net/hbuxiaoshe/article/details/6558391