这几天在看 libevent 的官方书籍跟着学习,开着个 Ubuntu 的虚拟机在 Windows 下来回切换,学习效率实在低下,且不说编译、测试这些复杂的步骤。所以决定研究一下如何在 Windows Visual Studio 环境下使用 libevent 库,这样学习效率会高很多。从网上借鉴了一些教程,都写的比较粗糙,我也是搞了好一会才搞定,所以自己记录一下。

下载 libevent

官网地址:http://libevent.org/ 直接下载最新版本即可: 2016-03-24_121036

编译 libevent 库

首先将下载好的 libevent-2.0.22-stable.tar.gz 解压出来,然后打开开始菜单,找到 Visual Studio Tools 打开。 2016-03-24_121403 打开后点击里面的 VS2013 开发人员命令提示 工具。 2016-03-24_121507 随后 cd 到你刚刚解压的 libevent-2.0.22-stable 目录下。 2016-03-24_121724 最后执行命令 nmake /f Makefile.nmake 编译 libevent。 2016-03-24_122454

与 Visual Studio 结合

上面 libevent 编译完成后,会在解压的 libevent-2.0.22-stable 目录下生成三个 .lib 的文件,分别是 libevent.lib libevent_core.lib libevent_extras.lib。把他们拷贝出来待用。 2016-03-24_122649 使用 Visual Studio 建立一个 Win32 控制台空项目,建立完成后首先在项目目录下新建两个文件夹,lib 和 inc,用来存放 .lib 库文件和 .h 头文件(熟悉的人目录结构你可以自己规划,我这样写只为新手入门准备,可以参考学习,后面熟悉了随便自己怎么改)。 2016-03-24_123030 随后,拷贝解压出来的 libevent-2.0.22-stable\include 所有文件,到 inc 目录,再拷贝 libevent-2.0.22-stable\WIN32-Code 目录下所有文件同样到 inc 目录,此时会出现重名目录的情况,直接覆盖就可以了,实际里面的文件不会重复。 2016-03-24_124321 然后拷贝编译好的三个 .lib 文件到 lib 目录下。 2016-03-24_124415 需要的文件我们都放到项目目录下了,接下来就是在项目中引入这两个目录。在项目上 右键-属性2016-03-24_124553 点击 VC++目录,分别在包含目录中引入项目目录下的 inc 文件夹、在库目录中引入 lib 文件夹。 2016-03-24_124604C/C++-代码生成 中,将 运行库 在 Debug 模式下修改为 多线程调试 (/MTd),在 Release 模式下修改为 多线程调试 (/MT)2016-03-24_124833链接器-输入附加依赖库 中分别添加三个 lib 文件和 socket 所需的库文件。 2016-03-24_125125 以上环境我们就搭建好了,接下来就是下一段代码来测试一下了。在项目中新建一个 mian.c 文件,输入一下代码编译并运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

#include <WinSock2.h> // windows socket

#include <event2/event.h> // libevent core

int main(int argc, char* argv[])
{
WSADATA wsa_data;
WSAStartup(MAKEWORD(2, 2), &wsa_data);

// init libevent
struct event_base* base = event_base_new();
if (!base)
{
puts("Couldn't get an event_base!");
}
else
{
// 获取当前使用了哪种 I/O 模型,Windows 下仅显示 win32
printf("Using Libevent with backend method <%s>.\n",
event_base_get_method(base));
}

WSACleanup();
event_base_free(base);
return 0;
}

如果你得到如下返回,那么证明你环境已经可以正常使用拉。接下来去摸索 libevent 的精髓吧。

1
Using Libevent with backend method <win32>.