libevent 使用记录(if_nametoindex、应用程序没有调用 WSAStartup问题)

libevent官网: https://libevent.org/

编译

windows 下编译(编译前需要改写东西,尽量和文章中的版本一致,不一致有可能会编译失败);

编译成功后,会得到libevent.lib、libevent_core.lib、libevent_extras.lib三个库文件

32位编译: 

参考: 32位编译(libevent-2.0.22-stable),注意#define _WIN32_WINNT 0x0500 添加到4个文件的第一行,像这样(event_iocp.c):

 

 

 ,总之,一定要添加在#ifndef _WIN32_WINNT上边!

64位编译:

参考: 64位编译(libevent-2.1.11-stable),修改Makefile.nmake文件,添加/MACHINE:X64

注意: 在编译时会有错,只要三个lib(libevent.lib、libevent_core.lib、libevent_extras.lib)文件编译出来就可以了。

 

使用

1. 打开VS属性(注意选择当前32/64位配置)->VC++目录->包含目录,添加libevent目录下的include文件夹

2. VS属性(注意选择当前32/64位配置)->VC++目录->库目录, 添加编译好的lib所在文件夹

3. 添加lib库:VS属性->链接器->输入->附加依赖项: 

Iphlpapi.lib
ws2_32.lib
wsock32.lib
libevent.lib
libevent_core.lib
libevent_extras.lib

Visual Studio 中使用遇到的问题:

0. 注意选择当前32/64位配置,这总是我犯的一个低级问题,项目选择的64位,属性中却编辑的32位配置。

1. 无法打开包括文件: event2/event-config.h

 

 

打开libevent目录,进入WIN32-Code\nmake\event2,例如我的:E:\dev\c++work\libevent-2.1.12-stable\libevent-2.1.12-stable\WIN32-Code\nmake\event2

复制event-config.h到{VS项目指向的include文件夹}/event2/下。

{VS项目指向的include文件夹}就是刚刚设置的项目属性->VC++目录->包含目录中设置的libevent include路径.

2.错误 LNK2019 无法解析的外部符号 if_nametoindex,该符号在函数 evutil_inet_pton_scope 中被引用

 

 

 在附加依赖项中没有添加Iphlpapi.lib.

3. 警告 LNK4098 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

 

 

 VS属性->链接器->输入->忽略特定默认库->添加LIBCMT

4. 执行event_init()提示[warn] signal.c: socketpair: 应用程序没有调用 WSAStartup,或者 WSAStartup失败。

或: [warn] evsig_init: socketpair: Successful WSAStartup not yet performed [WSANOTINITIALISED ]
[warn] socket: Successful WSAStartup not yet performed [WSANOTINITIALISED ]

event_init()调用前,添加:

 

#include <stdio.h>
#include <iostream>
#include <event.h>
#include <event2/http.h>
#include <event2/http_struct.h>
#include <event2/http_compat.h>
#include <event2/event-config.h>
using namespace std;

int main(void) {
    WSADATA wsa_data;
    WSAStartup(0x0201, &wsa_data);
    event_init();
    char *httpd_option_listen = "0.0.0.0";
    int httpd_option_port = 8080;
    struct evhttp *evHttp = evhttp_start(httpd_option_listen, httpd_option_port);
    if (evHttp == NULL) {
        cout << "错误!";
        getchar();
        return 0;
    }
    evhttp_set_timeout(evHttp, 5);
    evhttp_set_cb(evHttp, "/get", [](struct evhttp_request * req, void * data) {
         size_t len = evbuffer_get_length(req->input_buffer);
        cout << "req len:" << len;
        evbuffer *respBuff = evbuffer_new();
        evbuffer_add_printf(respBuff, "Hello ? World!");
        evhttp_send_reply(req, HTTP_OK, "Client", respBuff);
        evbuffer_free(respBuff);
    }, NULL);

    event_dispatch();
    evhttp_free(evHttp);
    return 0;
}

 

参考: https://www.cnblogs.com/nanzhi/p/7883911.html(32位编译)

参考: https://blog.csdn.net/d137578736/article/details/104499194(64位编译)

参考: https://blog.csdn.net/wwyyxx26/article/details/108918425(无法解析的外部符号 if_nametoindex)

posted @ 2021-10-31 23:09  耿明岩  阅读(1524)  评论(0编辑  收藏  举报
希望能帮助到你,顺利解决问题! ...G(^_−)☆