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)