编译libevent

669 阅读5分钟

Windows上libevent编译

libevent依赖zlib和openssl,因此我们先编译zlib和openssl

编译zlib

zlib是一个压缩库

下载zlib

下载地址 www.zlib.net/zlib-1.3.1.…

打开vs编译环境控制台

打开下图选择的控制台,该控制台表示使用x64编译x86的程序

image.png

进入zlib目录

image.png

开始编译

win32目录下有个Makefile.msc文件,使用这个文件进行编译

nmake -f win32/Makefile.msc

生成文件如下

image.png

zlib编译批处理文件

利用该文件,我们可以实现自动编译

set VS="C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsamd64_x86.bat"
set OUT="C:\Users\asrock\programs\out\vs2022_32\zlib"
call %VS%
cd zlib-1.3.1
nmake /f win32/Makefile.msc clean
nmake /f win32/Makefile.msc
md %OUT%\lib
md %OUT%\bin
md %OUT%\include
copy /Y *.lib %OUT%\lib
copy /Y *.h %OUT%\include
copy /Y *.dll %OUT%\bin
copy /Y *.exe %OUT%\bin
pause

编译openssl

openssl编译依赖perl和nasm

安装perl

进入perl官网

www.perl.org/

点击下载链接

image.png

image.png

image.png

image.png

我们选择不登陆下载perl

image.png

进入下载界面后,接着我们按照提示的步骤安装

image.png

执行上述三步后,perl将会安装成功,我们查看下perl的版本

 perl -v

This is perl 5, version 36, subversion 3 (v5.36.3) built for MSWin32-x64-multi-thread

Copyright 1987-2023, Larry Wall

Binary build 36.3r2 provided by ActiveState http://www.ActiveState.com
Built Wed Feb 21 18:02:05 2024

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at https://www.perl.org/, the Perl Home Page.

安装nasm

下载nasm

www.nasm.us/pub/nasm/re…

下载完后运行安装即可

开始编译openssl

下载openssl

github.com/openssl/ope…

进入openssl源码目录

image.png

使用perl生成Makefile文件

使用perl Configure VC-WIN32 --prefix=C:\Users\asrock\programs\out\vs2022_32\openssl命令生成Makefile文件,--prefix为指定安装的路径

C:\Users\asrock\programs\openssl-3.3.1>perl Configure VC-WIN32 --prefix=C:\Users\asrock\programs\out\vs2022_32\openssl
Configuring OpenSSL version 3.3.1 for target VC-WIN32
Using os-specific seed configuration
Created configdata.pm
Running configdata.pm
Created makefile.in
Created makefile
Created include\openssl\configuration.h

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL.md file first)      ***
***                                                                ***
**********************************************************************

开始编译

执行nmake, namke会自动找目录中的Makefile文件

C:\Users\asrock\programs\openssl-3.3.1>nmake
进行安装

执行nmake install命令,如果安装过程中有报错,使用管理员身份打开控制台,重新进行安装

C:\Users\asrock\programs\openssl-3.3.1>nmake install

可以看到我们的输出目录下有文件了

image.png

openssl编译安装批处理文件
@echo "start build openssl"
set VS="C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsamd64_x86.bat"
set OUT="C:\Users\asrock\programs\out\vs2022_32\openssl"
call %VS%
cd C:\Users\asrock\programs\openssl-3.3.1
perl Configure VC-WIN32 --prefix=%OUT%
nmake clean
nmake
nmake install
@echo "build openssl end"
pause

编译libevent

下载
git clone https://github.com/libevent/libevent.git

git checkout  release-2.1.12-stable
进入libevent目录,开始编译
C:\Users\asrock\programs\libevent>nmake /f Makefile.nmake OPENSSL_DIR=C:\Users\asrock\programs\out\vs2022_32\openssl
在编译时可能会遇到如下错误,我们需要修改在libevent目录下的“minheap-internal.h”里面加一句“#include<stdint.h>”

image.png

还可能遇到如下错误,该错误是libevent编译test相关文件时候报的错误

image.png

解决办法:修改test目录下的Makefile.nmake 文件

image.png

修改完文件后我们再次编译一下,发现还是有错误

image.png

上面问题的解决办法,我们修改evutil.c文件,添加#pragma comment(lib, "Iphlpapi.lib")

image.png

再次编译,发现可以编译成功了

libevent编译批处理文件
set VS="C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsamd64_x86.bat"
set OUT="C:\Users\asrock\programs\out\vs2022_32\libevent"
call %VS%
cd libevent
nmake /f Makefile.nmake clean
nmake /f Makefile.nmake OPENSSL_DIR=C:\Users\asrock\programs\out\vs2022_32\openssl
md %OUT%\lib
md %OUT%\bin
md %OUT%\include
copy /Y *.lib %OUT%\lib
xcopy /S/Y include %OUT%\include
xcopy /S/Y WIN32-Code\nmake %OUT%\include
copy /Y *.dll %OUT%\bin
copy /Y *.exe %OUT%\bin
pause

xcopy /S/Y include %OUT%\include这个命令的含义是:

  • xcopy: 使用xcopy命令进行复制
  • /S: 表示进行子目录复制,即递归复制include目录下的所有文件和子文件夹
  • /Y: 如果目标文件存在,则覆盖而不询问
  • include: 源目录,要复制的目录
  • %OUT%\include: 目标目录,将源目录include及其内容复制到变量%OUT%指定的目录下,新目录名为include

编写一个简单的程序测试libevent

image.png

image.png

image.png

image.png

#include <event2/event.h>
#include <iostream>

int main()
{
#ifdef _WIN32
    // windows socket库需要初始化
    WSADATA wver;
    WSAStartup(MAKEWORD(2, 2), &wver);

#endif

    // 创建event上下文
    event_base* base = event_base_new();

    if (base)
    {
        std::cout << "event_base_new success!" << std::endl;
    }

    std::cout << "Hello World!\n";
}

image.png

Linux上libevent编译

使用的Linux发行版本

[root@mini-desk ~]# cat /etc/redhat-release 
AlmaLinux release 9.4 (Seafoam Ocelot)

安装编译需要的依赖

dnf install perl g++ make automake  libtool unzip

编译zlib

[root@mini-desk ~]# tar -xf zlib-1.3.1.tar.gz 
[root@mini-desk ~]# cd zlib-1.3.1/
[root@mini-desk zlib-1.3.1]# ls
[root@mini-desk zlib-1.3.1]# ./configure 
[root@mini-desk zlib-1.3.1]# make -j 8
[root@mini-desk zlib-1.3.1]# make install

编译openssl

[root@mini-desk ~]# tar -xf openssl-3.3.1.tar.gz 
[root@mini-desk ~]# cd openssl-3.3.1/
[root@mini-desk openssl-3.3.1]# 
[root@mini-desk openssl-3.3.1]# ./config
[root@mini-desk openssl-3.3.1]# make -j 8
[root@mini-desk openssl-3.3.1]# make install

编译libevent

[root@mini-desk ~]# tar -xf libevent-2.1.12-stable.tar.gz 
[root@mini-desk ~]# cd libevent-2.1.12-stable/
[root@mini-desk libevent-2.1.12-stable]# ls
[root@mini-desk libevent-2.1.12-stable]# ./autogen.sh #生成configure
[root@mini-desk libevent-2.1.12-stable]# ./configure #生成Makefile
[root@mini-desk libevent-2.1.12-stable]# make -j 8
[root@mini-desk libevent-2.1.12-stable]# make install

简单测试文件

#include <event2/event.h>
#include <iostream>

int main()
{
#ifdef _WIN32
    // windows socket库需要初始化
    WSADATA wver;
    WSAStartup(MAKEWORD(2, 2), &wver);

#endif

    // 创建event上下文
    event_base* base = event_base_new();

    if (base)
    {
        std::cout << "event_base_new success!" << std::endl;
    }

    std::cout << "Hello World!\n";
}

编写一个编译用的Makefile

testlibevent: test.cpp
	g++ $^ -o $@ -levent

编译项目并运行

[root@mini-desk libevent-test]# make 
g++ test.cpp -o testlibevent -levent
[root@mini-desk libevent-test]# ./testlibevent 
event_base_new success!
Hello World!

参考文档