环境准备
环境
- 操作系统: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文件在如下目录:
在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文件:
编译openssl
安装perl,安装成功后,环境变量中会有如下项:
C:\Perl64\site\bin
C:\Perl64\bin
将nasm添加至环境变量中:
完成上述操作后,以管理员身份打开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
如下图:
编译运行: