zoukankan      html  css  js  c++  java
  • windows编译libevent时报告“缺少print_winsock_errors.obj”的解决

    一、综述

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库。

    libevent官网(http://libevent.org)下载源码包,在Windows平台编译时,会报缺少“print_winsock_errors.obj”的错误。

    二、原因及解决

    经检查,这是因为源码包中缺少文件test/print_winsock_errors.c导致,原因未知。

    解决方法:手工生成test/print_winsock_errors.c,以下为从git搜索到的代码内容:

    #include <winsock2.h>
    #include <windows.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    
    #include "event2/event.h"
    #include "event2/util.h"
    #include "event2/thread.h"
    
    #define E(x) printf (#x " -> "%s"
    ", evutil_socket_error_to_string (x));
    
    int main (int argc, char **argv)
    {
      int i, j;
      const char *s1, *s2;
    
    #ifdef EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED
      evthread_use_windows_threads ();
    #endif
    
      s1 = evutil_socket_error_to_string (WSAEINTR);
    
      for (i = 0; i < 3; i++) {
        printf ("
    iteration %d:
    
    ", i);
        E(WSAEINTR);
        E(WSAEACCES);
        E(WSAEFAULT);
        E(WSAEINVAL);
        E(WSAEMFILE);
        E(WSAEWOULDBLOCK);
        E(WSAEINPROGRESS);
        E(WSAEALREADY);
        E(WSAENOTSOCK);
        E(WSAEDESTADDRREQ);
        E(WSAEMSGSIZE);
        E(WSAEPROTOTYPE);
        E(WSAENOPROTOOPT);
        E(WSAEPROTONOSUPPORT);
        E(WSAESOCKTNOSUPPORT);
        E(WSAEOPNOTSUPP);
        E(WSAEPFNOSUPPORT);
        E(WSAEAFNOSUPPORT);
        E(WSAEADDRINUSE);
        E(WSAEADDRNOTAVAIL);
        E(WSAENETDOWN);
        E(WSAENETUNREACH);
        E(WSAENETRESET);
        E(WSAECONNABORTED);
        E(WSAECONNRESET);
        E(WSAENOBUFS);
        E(WSAEISCONN);
        E(WSAENOTCONN);
        E(WSAESHUTDOWN);
        E(WSAETIMEDOUT);
        E(WSAECONNREFUSED);
        E(WSAEHOSTDOWN);
        E(WSAEHOSTUNREACH);
        E(WSAEPROCLIM);
        E(WSASYSNOTREADY);
        E(WSAVERNOTSUPPORTED);
        E(WSANOTINITIALISED);
        E(WSAEDISCON);
        E(WSATYPE_NOT_FOUND);
        E(WSAHOST_NOT_FOUND);
        E(WSATRY_AGAIN);
        E(WSANO_RECOVERY);
        E(WSANO_DATA);
        E(0xdeadbeef); /* test the case where no message is available */
    
        /* fill up the hash table a bit to make sure it grows properly */
        for (j = 0; j < 50; j++) {
          int err;
          evutil_secure_rng_get_bytes(&err, sizeof(err));
          evutil_socket_error_to_string(err);
        }
      }
    
      s2 = evutil_socket_error_to_string (WSAEINTR);
      if (s1 != s2)
        printf ("caching failed!
    ");
    
      libevent_global_shutdown ();
    
      return EXIT_SUCCESS;
    }

    然后使用VS命令提示工具,在libevent解压目录下执行:nmake /f Makefile.nmake,编译顺利通过。

    三、其它

    经检查,在官网列出的1.4.x-stable, 2.0.x-stable, 2.1.x-stable等版本中貌似均存在此问题。

    print_winsock_errors.c只有一段测试代码,没有也关系不大,因此另一种解决方法是:修改CmakeFileList,从中删除与print_winsock_errors有关的内容。

  • 相关阅读:
    状压DP
    题解:中位数
    题解:三只小猪
    二分图最大匹配
    AC自动机
    题解 P1137 【旅行计划】
    题解 P1280 【尼克的任务】
    DFT&IDFT学习笔记
    emacs配置
    莫比乌斯反演推导即μ函数的证明
  • 原文地址:https://www.cnblogs.com/wggj/p/7472607.html
Copyright © 2011-2022 走看看