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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM