Win7+VS2013初试Thrift

时间:2023-03-09 03:26:40
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:\Boost\boost_vc_120" link=shared runtime-link=shared threading=multi debug release                                                                                                   cmd窗口获取静态库命令:bjam install stage --toolset=msvc-12.0 -- stagedir="C:\Boost\boost_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编译成功
 #include <iostream>
#include <boost/thread/thread.hpp> void hello()
{
std::cout << "Hello world, I'm a thread!" << std::endl;
}
int main()
{
boost::thread thrd(&hello);
thrd.join();
}

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

  1. 官网下载libevent-2.0.22-stable(使用git)
  2. 修改以下三个文件libevent-2.0.22-stable\event_iocp.c,libevent-2.0.22-stable\evthread_win32.c,libevent-2.0.22-stable\listener.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-stable\include目录下的文件和文件夹拷贝到此目录下,将libevent-2.0.22-stable\WIN32-Code下的文件和libevent-2.0.22-stable\WIN32-Code\nmake下的目录和文件拷贝到此目录下,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源码如下:

 #include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h> #ifndef WIN32
#include <netinet/in.h>
# ifdef _XOPEN_SOURCE_EXTENDED
# include <arpa/inet.h>
# endif
#include <sys/socket.h>
#endif #include "event2/bufferevent.h"
#include "event2/buffer.h"
#include "event2/listener.h"
#include "event2/util.h"
#include "event2/event.h" #include <WinSock2.h> static const char MESSAGE[] = "Hello, World!\n"; static const int PORT = ; static void conn_writecb(struct bufferevent *bev, void *user_data)
{
struct evbuffer *output = bufferevent_get_output(bev);
if (evbuffer_get_length(output) == )
{
printf("flushed answer\n");
bufferevent_free(bev);
}
} static void conn_eventcb(struct bufferevent *bev, short events, void *user_data)
{
if (events & BEV_EVENT_EOF)
{
printf("Connection closed.\n");
}
else if (events & BEV_EVENT_ERROR)
{
printf("Got an error on the connection: %s\n",
strerror(errno));/*XXX win32*/
}
/* None of the other events can happen here, since we haven't enabled
* timeouts */
bufferevent_free(bev);
} static void signal_cb(evutil_socket_t sig, short events, void *user_data)
{
struct event_base *base = (struct event_base *)user_data;
struct timeval delay = { , }; printf("Caught an interrupt signal; exiting cleanly in two seconds.\n"); event_base_loopexit(base, &delay);
} static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd,
struct sockaddr *sa, int socklen, void *user_data)
{
struct event_base *base = (struct event_base *)user_data;
struct bufferevent *bev; bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
if (!bev)
{
fprintf(stderr, "Error constructing bufferevent!");
event_base_loopbreak(base);
return;
}
bufferevent_setcb(bev, NULL, conn_writecb, conn_eventcb, NULL);
bufferevent_enable(bev, EV_WRITE);
bufferevent_disable(bev, EV_READ); bufferevent_write(bev, MESSAGE, strlen(MESSAGE));
} int main(int argc, char **argv)
{
struct event_base *base;
struct evconnlistener *listener;
struct event *signal_event; struct sockaddr_in sin; #ifdef WIN32
WSADATA wsa_data;
WSAStartup(0x0201, &wsa_data);
#endif base = event_base_new();
if (!base)
{
fprintf(stderr, "Could not initialize libevent!\n");
return ;
} memset(&sin, , sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT); listener = evconnlistener_new_bind(base, listener_cb, (void *)base,
LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -,
(struct sockaddr*)&sin,
sizeof(sin)); if (!listener)
{
fprintf(stderr, "Could not create a listener!\n");
return ;
} signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)base); if (!signal_event || event_add(signal_event, NULL)<)
{
fprintf(stderr, "Could not create/add a signal event!\n");
return ;
} event_base_dispatch(base); evconnlistener_free(listener);
event_free(signal_event);
event_base_free(base); printf("done\n");
return ;
}

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. 执行命令:ms\do_ms
  5. 执行命令:nmake -f ms\ntdll.mak (编译动态库)                                                                                                         nmake -f ms\nt.mak    (编译静态库)
  6. 执行命令:nmake -f ms\ntdll.mak install (装载动态库)                                                                                                 nmake -f ms\nt.mak install    (装载静态库)
  7. 执行命令:nmake -f ms\ntdll.mak test   (测试动态库)                                                                                                 nmake -f ms\nt.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,代码如下,启动项目
     #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <openssl/bn.h>
    #include <openssl/ec.h>
    #include <openssl/rand.h>
    #include <openssl/err.h>
    #include <openssl/ecdsa.h>
    #include <openssl/ecdh.h> #pragma comment(lib, "libeay32.lib") int main()
    { return ;
    }

win7环境下VS2013编译thrift步骤:

  1. 下载thrift-0.9.2(本人使用git下载源码包)
  2. 打开thrift-0.9.2\lib\cpp下的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\tutorial目录下,包括shared.thrift、tutorial.thrift和thrift-0.9.2\tutorial\cpp目录下的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.****.net/liuhongxiangm/article/details/18400837

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

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