Windows Visual Studio 使用 libevent 库

这几天在看 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_124604

C/C++-代码生成 中,将 运行库 在 Debug 模式下修改为 多线程调试 (/MTd),在 Release 模式下修改为 多线程调试 (/MT)

2016-03-24_124833

链接器-输入附加依赖库 中分别添加三个 lib 文件和 socket 所需的库文件。

2016-03-24_125125

以上环境我们就搭建好了,接下来就是下一段代码来测试一下了。在项目中新建一个 mian.c 文件,输入一下代码编译并运行。

#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 的精髓吧。

Using Libevent with backend method <win32>.

评论