WINDOWS下安装使用libevent

环境

  • IDE:VS2019
  • 系统:windows10
  • libevent下载地址:http://libevent.org/
  • 下载版本号:2.0.22-stable

编译静态库

  • 将 libevent-2.0.22-stable.tar.gz 下载至任意盘符,解压至当前文件,得到libevent-2.0.22-stable文件夹。
  • 在libevent-2.0.22-stable文件夹下找到下面三个文件:
    event_iocp.c
    evthread_win32.c
    listener.c
    打开并在开头加上宏定义:
    #define _WIN32_WINNT 0x0500(一定要加在头文件之前)

因为event_iocp.c里用到头文件里的函数定义,如InitializeCriticalSectionAndSpinCount,
会包含,而这个头文件里这个函数是这样定义的:
#if (_WIN32_WINNT >= 0x0403)
WINBASEAPI
BOOL WINAPI
InitializeCriticalSectionAndSpinCount(
__out LPCRITICAL_SECTION lpCriticalSection,
__in DWORD dwSpinCount
);

WINBASEAPI
DWORD
WINAPI
SetCriticalSectionSpinCount(
__inout LPCRITICAL_SECTION lpCriticalSection,
__in DWORD dwSpinCount
);
#endif

所以要定义_WIN32_WINNT这个宏,而且值要大于0x0403。
如果没有这个宏或不满足条件,编译器会假定这个函数没有定义,
等到链接时再寻找它,这样这个函数的符号就假定返回一个int,
而显示标准库文件里这个函数不是返回int,所以在链接时就会找不到这个函数符号。

  • 编译
    使用vs的命令行工具(我是 工具–> 命令行(L) --> 开发者命令提示(C)),cd到libevent-2.0.22-stable目录,执行脚本makefile.nmake,命令如下:
    nmake /f Makefile.nmake
    这样就会生成三个静态库:
    libevent_core.lib
    libevent_extras.lib
    libevent.lib

构建项目

  • 新建一个vs空项目
  • 在项目目录下建一个libevent文件夹
  • 在libevent中新建一个lib文件夹,将上面三个lib文件copy到该目录下。
  • 在libevent中再新建一个include文件夹。
  • 将libevent-2.0.22-stable\include下的文件和文件夹copy到该目录下。
  • 将libevent-2.0.22-stable\WIN32-Code下的文件和文件夹copy到该目录下,
  • 整合两个event2目录下的资源,放同一个文件夹下

项目配置

  • VC++目录:
    包含目录,添加刚刚新建的include目录
    库目录,添加刚刚的lib目录;

  • C/C++:
    代码生成–>运行库:
    Debug模式下选:多线程调试 (/MTd),
    Release下模式下选:多线程 (/MT)

  • 连接器:
    输入->附加依赖项:
    ws2_32.lib
    wsock32.lib
    libevent.lib
    libevent_core.lib
    libevent_extras.lib
    另外两个库ws2_32.lib和wsock32.lib是用来编译Windows网络相关的程序库。

测试代码

  • 新建一个main.cpp文件
  • 从libevent-2.0.22-stable\sample目录下拷贝time-test.c文件中的代码到main中,代码如下:
/*
 * Copyright (c) 2000-2007 Niels Provos 
 * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#ifndef _EVENT2_EVENT_STRUCT_H_
#define _EVENT2_EVENT_STRUCT_H_

/** @file event2/event_struct.h

  Structures used by event.h.  Using these structures directly WILL harm
  forward compatibility: be careful.

  No field declared in this file should be used directly in user code.  Except
  for historical reasons, these fields would not be exposed at all.
 */

#ifdef __cplusplus
extern "C" {
#endif

#include 
#ifdef _EVENT_HAVE_SYS_TYPES_H
#include 
#endif
#ifdef _EVENT_HAVE_SYS_TIME_H
#include 
#endif

/* For int types. */
#include 

/* For evkeyvalq */
#include 

#define EVLIST_TIMEOUT	0x01
#define EVLIST_INSERTED	0x02
#define EVLIST_SIGNAL	0x04
#define EVLIST_ACTIVE	0x08
#define EVLIST_INTERNAL	0x10
#define EVLIST_INIT	0x80

/* EVLIST_X_ Private space: 0x1000-0xf000 */
#define EVLIST_ALL	(0xf000 | 0x9f)

/* Fix so that people don't have to run with  */
#ifndef TAILQ_ENTRY
#define _EVENT_DEFINED_TQENTRY
#define TAILQ_ENTRY(type)						\
struct {								\
	struct type *tqe_next;	/* next element */			\
	struct type **tqe_prev;	/* address of previous next element */	\
}
#endif /* !TAILQ_ENTRY */

#ifndef TAILQ_HEAD
#define _EVENT_DEFINED_TQHEAD
#define TAILQ_HEAD(name, type)			\
struct name {					\
	struct type *tqh_first;			\
	struct type **tqh_last;			\
}
#endif

struct event_base;
struct event {
	TAILQ_ENTRY(event) ev_active_next;
	TAILQ_ENTRY(event) ev_next;
	/* for managing timeouts */
	union {
		TAILQ_ENTRY(event) ev_next_with_common_timeout;
		int min_heap_idx;
	} ev_timeout_pos;
	evutil_socket_t ev_fd;

	struct event_base *ev_base;

	union {
		/* used for io events */
		struct {
			TAILQ_ENTRY(event) ev_io_next;
			struct timeval ev_timeout;
		} ev_io;

		/* used by signal events */
		struct {
			TAILQ_ENTRY(event) ev_signal_next;
			short ev_ncalls;
			/* Allows deletes in callback */
			short *ev_pncalls;
		} ev_signal;
	} _ev;

	short ev_events;
	short ev_res;		/* result passed to event callback */
	short ev_flags;
	ev_uint8_t ev_pri;	/* smaller numbers are higher priority */
	ev_uint8_t ev_closure;
	struct timeval ev_timeout;

	/* allows us to adopt for different types of events */
	void (*ev_callback)(evutil_socket_t, short, void *arg);
	void *ev_arg;
};

TAILQ_HEAD (event_list, event);

#ifdef _EVENT_DEFINED_TQENTRY
#undef TAILQ_ENTRY
#endif

#ifdef _EVENT_DEFINED_TQHEAD
#undef TAILQ_HEAD
#endif

#ifdef __cplusplus
}
#endif

#endif /* _EVENT2_EVENT_STRUCT_H_ */

运行结果如下:
WINDOWS下安装使用libevent_第1张图片

你可能感兴趣的:(socket,c++)