Windows10(Win10)下编译libevent
一. 准备工作
去官网下载最新的稳定发布版本libevent-2.1.8-stable.tar.gz
官网地址:http://libevent.org/
二. 使用VS2012编译
1.解压libevent到C:\Users\admin\Desktop\libevent\libevent-2.1.8-stable
2.打开“VS2010开发人员命令提示”工具,如下图所示。
3.输入指令开始编译
使用vs的命令行工具,cd到libevent-2.1.8-stable目录,执行脚本makefile.nmake,命令如下:
nmake Makefile.nmake,如下图所示。
有网友说编译之前应该在以下3个文件开头添加“#define _WIN32_WINNT 0x0500”
libevent-2.1.8-stable \event_iocp.c
libevent-2.1.8-stable \evthread_win32.c
libevent-2.1.8-stable \listener.c
但是并没有说明为什么要添加,而且我没添加,编译和使用时也没什么问题。
后来还是查了一下_WIN32_WINNT的意义,可以参考:修改WINVER、_WIN32_WINNT和_MSC_VER
4.编译结果
编译成功后,在libevent-2.1.8-stable目录下生成如下三个库文件。
libevent.lib
libevent_core.lib
libevent_extras.lib
至于这三个库文件的功能,可以参考:libevent学习之一:libevent源码的特点和结构
三、使用示例
1.新建项目
创建一个最简单的WIN32 Console(中文叫Win32控制台)工程,默认设置即可
2 拷贝文件
2.1 在项目目录中新建一个lib文件夹,将上面三个lib文件copy到该目录下。
2.2 在项目目录中再新建一个include文件夹,
将libevent-2.1.8-stable\include下的文件和文件夹copy到该目录下,
将libevent-2.1.8-stable\WIN32-Code下的文件和文件夹copy到该目录下,2个event2目录下的文件合并一起。
3 添加代码
在项目名 .cpp文件中添加如下代码
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <winsock2.h>
#include <event.h>
#include <evhttp.h>
void root_handler(struct evhttp_request *req, void *arg)
{
struct evbuffer *buf = evbuffer_new();
if (!buf)
{
puts("faiedto create response buffer");
return;
}
evbuffer_add_printf(buf,"Hello:%s\n",evhttp_request_uri(req));
evhttp_send_reply(req, HTTP_OK,"0K",buf);
}
void generic_handler(struct evhttp_request *req,void *arg)
{
struct evbuffer *buf = evbuffer_new();
if (!buf)
{
puts("failed to create response buffer");
return;
}
evbuffer_add_printf(buf,"Requested:%s\n",evhttp_request_uri(req));
evhttp_send_reply(req,HTTP_OK,"OK",buf);
}
int _tmain(int argc, _TCHAR* argv[])
{
struct evhttp *httpd;
WSADATA wsaData;
DWORD Ret;
if ((Ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)
{
printf("WSAStartup failed with error %d\n",Ret);
return -1;
}
event_init();
httpd = evhttp_start("0.0.0.0",80);
if (!httpd)
{
return -1;
}
evhttp_set_cb(httpd,"/",root_handler,NULL);
evhttp_set_gencb(httpd,generic_handler,NULL);
printf("httpdserver start OK!\n");
event_dispatch();
evhttp_free(httpd);
WSACleanup();
return 0;
}
3 项目配置
3.1 C/C++:
附加包含目录,添加刚刚新建的include目录,如下图所示。
3.2 添加刚刚的lib目录
链接器>附加依赖项:
ws2_32.lib
wsock32.lib
lib\libevent.lib
lib\libevent_core.lib
lib\libevent_extras.lib
另外两个库ws2_32.lib和wsock32.lib是用来编译Windows网络相关的程序库,如下图所示。
3.3 C/C++:
代码生成-->运行库:
Debug模式下选:多线程调试 (/MTd),
Release下模式下选:多线程 (/MT)
3.4 编译&测试
如果顺利,运行起来,会在命令行窗口中显示“httpd server start OK!”如图所示
打开浏览器,在地址栏输入http://localhost/hell0,libevent,如果浏览器显示“Requested:/hell0.libevent”就表示代码成功。