неопределенная ссылка на imp_getaddrinfo

Я изучаю, как программировать сеть в Windows через C++, все идет хорошо, за исключением того, что я столкнулся с проблемой, которую я не мог решить в течение 3-4 дней, я использую Dev-C++ 5.5.3(Orwell), компилятор TDM-GCC 4.7.1. Я добавил "-lwsock32" (без кавычек) в параметры компоновщика. все работает хорошо, кроме "freeaddrinfo" и "getaddrinfo", вот что написано о двух из этих функций.

неопределенная ссылка на `imp_getaddrinfo@16'

неопределенная ссылка на `imp_freeaddrinfo@4'

Я где-то читал, что мне нужно определить версию Windows, которую я хотел бы использовать, поэтому я определил _WINNT_WIN32 0x0601 как требуется, но безрезультатно. Вот мой код (сокращенный):

#define _WINNT_WIN32 0x0601
#include <ws2tcpip.h>
#include <winsock2.h>
#include <stdio.h>

#define DEFAULT_PORT "27015"
// server

int main()
{
    WSADATA wsaData;                                
    ZeroMemory(&wsaData,sizeof(wsaData));
    int nResult = WSAStartup(MAKEWORD(2,2),&wsaData);
    if(nResult != 0)
     {
                printf(TEXT("WSAStartup function failed, value: %d\n"),nResult);
                Sleep(5000);
                return 0001;
     }
    else
      printf(TEXT("WSAStartup function has succeeded! value: %d\n"),nResult);
    struct addrinfo *result = NULL, *ptr = NULL, hints;
    ZeroMemory(&hints,sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    nResult = getaddrinfo(NULL,DEFAULT_PORT,&hints,&result);
    if(nResult != 0)
    {
        printf("getaddrinfo did not return 0... failure...");
        WSACleanup();
        return 0002;
    }
    SOCKET ListenSocket = INVALID_SOCKET;
    ListenSocket = socket(result->ai_family,result->ai_socktype,result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("Error at socket():%ld\n",WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 0003;
    }
    nResult = bind(ListenSocket, result->ai_addr,(int)result->ai_addrlen);
    if(nResult == SOCKET_ERROR) 
    {
        printf("bindfailed with error %d\n",WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 0004;
    }
    freeaddrinfo(result);
    if(listen(ListenSocket,SOMAXCONN) == SOCKET_ERROR)
    {
        printf("lISTEN FAILED WITH ERROR %LD\n",WSAGetLastError());
        closesocket(ListenSocket);
    }
    return 1337^9001;
} 

Спасибо.


person NULL    schedule 09.01.2014    source источник
comment
Возможно дубликат stackoverflow.com/questions/5220190/ .   -  person thokra    schedule 09.01.2014
comment
Да, я читал, но это не помогло.   -  person NULL    schedule 09.01.2014


Ответы (2)


Убедитесь, что вы определили _WIN32_WINNT в своем определении препроцессора и используете -lWs2_32 см. здесь

person alexbuisson    schedule 09.01.2014

Это классический случай неразрешенного внешнего. Вы пытаетесь использовать функцию getaddrinfo. Прокрутите вниз ссылку на документацию до раздела, озаглавленного «Требования». Он говорит вам, что вам нужно включить Ws2tcpip.h для объявления функции, и вы уже сделали это. Но это также говорит вам, что вам нужно использовать библиотеку импорта Ws2_32.lib, чтобы предоставить определение функции. Это шаг, который вы пропустили.

Итак, чтобы решить проблему, вам нужно связать библиотеку Ws2_32, добавив -lWs2_32 в параметры командной строки.

person David Heffernan    schedule 09.01.2014