Windows平台编译Libevent

发布时间 2023-12-14 15:53:11作者: 西兰花战士

环境准备

环境

  • 操作系统:Windows 10 64位
  • 编译器:VS 2019 社区版

工具

perl

该工具用于编译openssl。

下载地址:https://www.alipan.com/s/4F2pZZgRVMd

nasm

该工具用于编译openssl。

下载地址:https://www.alipan.com/s/NScV7wbc24f

zlib源码

用于压缩与解压缩

下载地址:https://www.zlib.net/

openssl源码

用于加密传输。

下载地址:https://www.openssl.org/source/

libevent源码

libevent网络库。

下载地址:https://libevent.org/

VS命令行

在开始菜单中找到Visual studio2019,打开VS命令行,会有如下几个文件,含义如下:

  • x64 Native Tools Command Prompt for VS 2019:    在64位系统编译64位库文件
  • x64_x86 Cross Tools Command Prompt for VS 2019:  在64位系统编译32位库文件
  • x86 Native Tools Command Prompt for VS 2019:    在32位系统编译32位库文件
  • x86_x64 Cross Tools Command Prompt for VS 2019:  在32位系统编译64位库文件

本机选择的是x64_x86 Cross Tools Command Prompt for VS 2019。

编译zlib

本人zlib文件在如下目录:

E:\Libevent\zlib-1.3

VS命令行中运行如下命令:

1 E:      
2 cd E:\Libevent\zlib-1.3
3 nmake /f win32\Makefile.msc clean
4 nmake /f win32\Makefile.msc

执行完成后,会产生如下.lib文件:

zdll.lib          //动态库
zlib.lib          //静态库

如下.dll文件:

zlib1.dll

编译openssl

安装perl,安装成功后,环境变量中会有如下项:

C:\Perl64\site\bin
C:\Perl64\bin

将nasm添加至环境变量中:

D:\Tool\nasm-2.13.03

完成上述操作后,以管理员身份打开VS命令行:

1 E:
2 cd "E:\Libevent\openssl-3.2.0"
3 perl Configure VC-WIN32 --prefix=E:\Libevent\Out\openssl
4 nmake clean
5 nmake
6 nmake install

编译完成后,E:\Libevent\Out\openssl目录下会有如下文件:

编译Libevent

在编译Libevent时,需要指定openssl的目录,具体看命令:

1 E:
2 cd E:\Libevent\libevent-2.1.12-stable
3 nmake /f Makefile.nmake clean
4 nmake /f Makefile.nmake OPENSSL_DIR=E:\Libevent\Out\openssl

会出现如下报错:

E:\Libevent\libevent-2.1.12-stable\minheap-internal.h(73): error C2065: “UINT32_MAX”: 未声明的标识符

打开minheap-internal.h文件,该文件在libevent-2.1.12-stable目录下。在其中添加 #include "stdint.h" 头文件,如下图:

重新执行nmake命令:

nmake /f Makefile.nmake OPENSSL_DIR=E:\Libevent\Out\openssl

报无法找到链接文件:

LINK : fatal error LNK1181: 无法打开输入文件“E:\Libevent\Out\openssl\lib\libeay32.lib”

打开libevent-2.1.12-stable\test\Makefile.nmake文件,将ssleay32.lib和libeay32.lib改为libcrypto.lib、libssl.lib,如下图:

继续编译,发现报无法解析外部符号:

error LNK2019: 无法解析的外部符号 __imp__if_nametoindex@4

在libevent-2.1.12-stable\test\Makefile.nmake文件中添加Iphlpapi.lib库,如下图:

再次编译,无报错,编译成功。

可以试着运行test目录下的regress.exe程序,该程序用来测试libevent中各个模块是否能够正常工作。如果报错找不到dll动态库,需要将openssl\bin中 libcrypto-3.dll和libssl-3.dll拷贝到regress.exe同级目录。

编译完成后,我将所有的lib文件和头文件拷贝Out\libevent中了,方便后续引用。

测试程序

用VS2019创建一个控制台程序,编写如下代码:

 1 #include <iostream>
 2 #include "event2\event.h"
 3 
 4 int main()
 5 {
 6     //初始化socket 库
 7     WORD wVersion = MAKEWORD(2, 2);
 8     WSADATA wsaData;
 9     WSAStartup(wVersion, &wsaData);
10 
11     //创建上下文
12     event_base* pBase = event_base_new();
13     if (pBase)
14         std::cout << "event_base create success!" << std::endl;
15 
16     WSACleanup();
17     return 0;
18 }

右击项目,在快捷菜单中选择 ”属性“ - ”c/c++“ - ”常规“,在附加包含目录中添加libevent头文件目录。如下图:

在”链接器“ - ”常规“ - ”附加库目录“中添加libevent库目录。如下图:

在”链接器“ - ”输入“ - ”附加依赖项“中添加.lib文件:

libevent.lib
ws2_32.lib
Iphlpapi.lib

如下图:

编译运行:

参考

本文参考至夏曹俊老师的《Libevent C++高并发网络编程》课程,perl和nasm是从老师主页下载,主页地址:http://ffmpeg.club/libevent.html