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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!