Socket通信库libevent成熟、稳定、性能高,在unix和windows下都能使用,在证券交易领域也有不少成功的应用,已经用事实证明是非常棒的socket通信库。对我们目前交易系统的unix重构来说,是比较合适的选择 –– 坑少、在证券交易项目中有成功案例、unix和windows下都能用、性能高等。
在具体开发过程中,我采用在windows上开发测试,再在unix上运行测试的原则。
Windows开发环境:win7、win10。
Unix开发环境:centos7。
软件版本:
Windows:windows7
VS:vs2019 community
libevent :2.1.12 libevent
zlib:1.2.11 zlib Home Site
openssl:1.1.1l /source/index.html
版本:5.26 Perl Download - www.perl.org
安装过程略。
安装好后,设置perl的环境变量,比如:D:\Perl64\bin
把VS的nmake环境变量也配置下,比如:
D:\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\Hostx64\x64
版本:2.13.03
我这里是直接解压缩一个zip 包:nasm-2.13.03-win64.zip
然后把环境变量设置一下(能找到nasm.exe文件),比如:
D:\Program Files\nasm-2.13.03-win64\nasm-2.13.03
⑶ 开始编译
选择vs的x64 Native tools,进入openssl目录:
编译64位(32位的话用VC-WIN32):
perl configure VC-WIN64A no-shared \
--prefix= D:\libevent\openssl-1.1.1\build32 \
--openssldir= D:\libevent\openssl-1.1.1\build\SSL
说明:
如果报错:you may need to install the Win32::Console module
则修改 D:\Perl64\site\lib\ActivePerl目录下的Config.pm文件,在400行左右,注释掉一些代码,如下“红色代码”所示:
# Prevent calling Win32::Console::DESTROY on a STDOUT handle
#my $console;
sub _warn {
# my($msg) = @_;
# unless (-t STDOUT) {
# print "\n$msg\n";
# return;
# }
# require Win32::Console;
# unless ($console) {
# $console = Win32::Console->new(Win32::Console::STD_OUTPUT_HANDLE());
# }
# my($col,undef) = $console->Size;
# print "\n";
# my $attr = $console->Attr;
# $console->Attr($Win32::Console::FG_RED | $Win32::Console::BG_WHITE);
# for (split(/\n/, "$msg")) {
# $_ .= " " while length() < $col-1;
# print "$_\n";
# }
# $console->Attr($attr);
# print "\n";
}
生成makefile文件后,下面执行命令:
nmake (可能耗费时间较长,请耐心等待10分钟)
nmake install
D:\libevent\zlib-1.2.11
运行完毕后会生成2个obj文件。
D:\libevent\zlib-1.2.11\contrib\vstudio\vc14\ zlibvc.sln
编译项目。
如果报错,一般这么做就能解决:
修改以下5个文件:
①在 event_iocp.c evthread_win32.c listener.c 中加入一个宏定义 #define _WIN32_WINNT 0x0500
②修改 minheap-internal.h 其中有一个UINT32_MAX的宏定义不受支持 改成UINT_MAX
③修改 Makefile.nmake 找到 CFLAGS=$(CFLAGS) /Ox /W3 /wd4996 /nologo /Zi 务必加上最后一个选项方便调试。
⑶ 开始编译
nmake /f Makefile.nmake OPENSSL_DIR=D:\libevent\openssl-1.1.1\build32
注意,这里openssl的目录。里面有这几个文件夹。
找不到libeay32.lib。
解决办法:
① 打开libevent的test目录里的Makefile.nmake文件。
找到这行:
② 分别把ssleay32.lib、libeay32.lib文件替换成openssl里lib目录下的:libcrypto.lib、libssl.lib文件。
③ 先nmake /f Makefile.nmake clean,然后再运行:
nmake /f Makefile.nmake OPENSSL_DIR=D:\libevent\openssl-1.1.1\build32
发现会报这样的错误:
libcrypto.lib(e_capi.obj) : error LNK2001: 无法解析的外部符号 __imp__CertFreeCertificateContext@4
继续修改libevent-2.1.12\test目录下的Makefile.nmake文件,加上Crypt32.lib库。
④ 运行后又发现下面的错误:
修改minheap-internal.h文件,加上:#pragma comment(lib, "Iphlpapi.lib")
然后:
nmake /f Makefile.nmake clean
nmake /f Makefile.nmake OPENSSL_DIR=D:\libevent\openssl-1.1.1\build32
测试成功!
参考:
(1) WINDOWS下安装使用libevent
https://blog.csdn.net/luoxin97/article/details/106716980
(2)nmake fatal error u1077:path/c1.exe 返回代码0x2解决思路
https://blog.csdn.net/sean4m/article/details/60143222
(3)windows编译libevent报错
https://blog.csdn.net/weixin_41560737/article/details/126787906
https://blog.csdn.net/yuanshenqiang/article/details/121018148
https://blog.csdn.net/qq_33194301/article/details/104879626
http://t.zoukankan.com/zkhm123-p-5976061.html
(4)多线程环境中使用Libevent
https://blog.csdn.net/whf_139/article/details/126578936