暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【C/C++】Win10 vs2017 编译libevent类库

hCodeisDawn 2021-09-16
1235
0
libevent简介
Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。
    # 官方网站:https://libevent.org/
    # 百度百科:https://baike.baidu.com/item/libevent/2492112?fr=aladdin


    1
    环境准备
      # win10 x64
      # visual studio 2017
      # perl 5.24.3.2404
      # nasm 2.13.03
      # zlib 1.2.11
      # openssl 1.1.1
      # libevent 2.1.8


      2
      类库编译

      1. zlib批处理文件

        @echo "zlib build start"


        set VS2017="E:\Visual Studio 2017\VC\Auxiliary\Build\vcvarsamd64_x86.bat"
        set OUT="G:\C++\libevent\out\vs2017_32\zlib"
        call %VS2017%
        cd zlib-1.2.11


        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


        @echo "zlib build successed"
        pause


        2. openssl批处理文件

        预装perl、nasm并配置环境变量

          @echo "openssl build start"


          set VS2017="E:\Visual Studio 2017\VC\Auxiliary\Build\vcvarsamd64_x86.bat"
          set OUT="G:\C++\libevent\out\vs2017_32\openssl"
          call %VS2017%


          cd G:\C++\libevent\openssl-1.1.1
          G:
          perl Configure VC-WIN32 --prefix=%OUT%


          nmake clean
          nmake
          nmake install


          @echo "openssl build successed"
          pause


          3. libevent

            # (1)libevent编译
            nmake /f Makefile.nmake OPENSSL_DIR=G:\C++\libevent\out\vs2017_32\openssl
            # 错误
            正在生成代码...
            cl I.. I../WIN32-Code I../WIN32-Code/nmake I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL /IG:\C++\libevent\out\vs2017_32\openssl\include /DEVENT__HAVE_OPENSSL /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib ..\libevent_openssl.lib G:\C++\libevent\out\vs2017_32\openssl\lib\libeay32.lib G:\C++\libevent\out\vs2017_32\openssl\lib\ssleay32.lib gdi32.lib User32.lib regress.obj regress_buffer.obj regress_http.obj regress_dns.obj regress_testutils.obj regress_rpc.obj regress.gen.obj regress_et.obj regress_bufferevent.obj regress_listener.obj regress_util.obj tinytest.obj regress_main.obj regress_minheap.obj regress_iocp.obj regress_thread.obj regress_finalize.obj regress_ssl.obj
            LINK : fatal error LNK1181: 无法打开输入文件“G:\C++\libevent\out\vs2017_32\openssl\lib\libeay32.lib”
            NMAKE : fatal error U1077: “"E:\Visual Studio 2017\VC\Tools\MSVC\14.16.27023\bin\HostX64\x86\cl.EXE"”: 返回代码“0x2
            Stop.
            NMAKE : fatal error U1077: “"E:\Visual Studio 2017\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2
            Stop.


            # 原因:libevent-master\test\Makefile.nmake $(SSL_LIBS)属性引用了已移除的openssl类库
            # 修改:修改Makefile.nmake $(SSL_LIBS)属性为编译好的openssl类库,如下
            SSL_LIBS=..\libevent_openssl.lib $(OPENSSL_DIR)\lib\libeay32.lib $(OPENSSL_DIR)\lib\ssleay32.lib gdi32.lib User32.lib
            =>
            SSL_LIBS=..\libevent_openssl.lib $(OPENSSL_DIR)\lib\libcrypto.lib $(OPENSSL_DIR)\lib\libssl.lib gdi32.lib User32.lib


            # (2)添加zlib支持
            # Makefile.name添加zlib编译
            REGRESS_OBJS=regress.obj regress_buffer.obj regress_http.obj regress_dns.obj \
            regress_testutils.obj \
            regress_rpc.obj regress.gen.obj \
            regress_et.obj regress_bufferevent.obj \
            regress_listener.obj regress_util.obj tinytest.obj \
            regress_main.obj regress_minheap.obj regress_iocp.obj \
              regress_thread.obj regress_finalize.obj $(SSL_OBJS)
            =>
            REGRESS_OBJS=regress.obj regress_buffer.obj regress_http.obj regress_dns.obj \
            regress_testutils.obj \
            regress_rpc.obj regress.gen.obj \
            regress_et.obj regress_bufferevent.obj \
            regress_listener.obj regress_util.obj tinytest.obj \
            regress_main.obj regress_minheap.obj regress_iocp.obj \
            regress_thread.obj regress_finalize.obj $(SSL_OBJS) regress_zlib.obj
            # Makefile.name添加zlib include
            CFLAGS=/I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL $(SSL_CFLAGS)
            =>
            CFLAGS=/I.. /I../zlib/include /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL $(SSL_CFLAGS)
            # Makefile.name添加zlib lib
            LIBS=..\libevent.lib ws2_32.lib shell32.lib advapi32.lib
            =>
            LIBS=..\libevent.lib ws2_32.lib shell32.lib advapi32.lib ..\zlib\lib\zdll.lib
            # WIN32-Code\nmake\event2\event-config.h添加zlib宏定义
            #define EVENT__HAVE_LIBZ
            # 清理nmake环境重新编译
            nmake /f Makefile.nmake clean
            nmake /f Makefile.nmake OPENSSL_DIR=G:\C++\libevent\out\vs2017_32\openssl
            # 测试 test\regress > test.log
            bufferevent/bufferevent_zlib: [forking] OK

            批处理文件

              @echo "libevent build start"


              set VS2017="E:\Visual Studio 2017\VC\Auxiliary\Build\vcvarsamd64_x86.bat"
              set OUT="G:\C++\libevent\out\vs2017_32\libevent"
              call %VS2017%
              cd libevent-master


              nmake /f Makefile.nmake clean
              nmake /f Makefile.nmake OPENSSL_DIR=G:\C++\libevent\out\vs2017_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


              @echo "libevent build successed"
              pause


              3
              环境测试
                #include <event2/event.h>
                #include <iostream>


                int main()
                {
                #ifdef _WIN32
                WSADATA wsa;
                WSAStartup(MAKEWORD(2,2), &wsa);
                #endif


                std::cout << "Hello libevent!\n";
                event_base * base = event_base_new();
                if (base) {
                std::cout << "libevent环境正常" << std::endl;
                }
                return 0;
                }

                至此,win10平台libevent环境已搭建完成(linux下libevent环境搭建不做过多描述,将压缩包解压编译安装即可),接下来可以基于libevent类库进行网络编程了。

                文章转载自hCodeisDawn,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论