Неопределенная ссылка на getaddrinfo - PullRequest
9 голосов
/ 07 марта 2011

Я получаю эту ошибку уже довольно давно, и Google тоже не особо помогает.

Я новичок в программировании Winsock и пытаюсь учиться на онлайн-ресурсах. Я пытаюсь создать простой сервер, используя детали на веб-сайте MSDN. Всякий раз, когда я компилирую код (MinGW), я получаю ошибку, упомянутую в заголовке (Undefined reference to getaddrinfo). Ниже приведен код:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#define WINVER WindowsXP

#include <windows.h>
#include <winsock2.h>
#include <winsock.h>
#include <ws2tcpip.h>
#include <stdio.h>

int main() {
    WSADATA wsaData;
    int iResult;
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    #define DEFAULT_PORT "27015"

    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;

    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    return 0;
}  

Я компилирую с помощью следующей команды:

gcc msdn_np.c -o msdn_np.exe -lWS2_32

Ответы [ 3 ]

11 голосов
/ 07 марта 2011

Разве это не та же проблема, что и здесь?

http://programmingrants.blogspot.com/2009/09/tips-on-undefined-reference-to.html

В основном не забудьте связать с Ws2_32.lib (сообщение от компоновщика, так что это должно бытьпричина), но вы, кажется, уже делаете это.

... если вы работаете со старой версией инструментов программирования Windows, скажите, что у вас версия выше XP, поставив #define _WIN32_WINNT 0x0501 передвключая заголовки (вряд ли это будет необходимо в настоящее время, но возможно).

Могут быть и другие простые проблемы.Обычное (Unix) соглашение для библиотек состоит в том, чтобы добавить их к lib.В дальнейшем значение для -lWS32_32 будет означать поиск файла с именем libWS32_32.a.Вероятно, он не находит его, потому что ему не хватает пути к каталогу, содержащему библиотеку.Вы можете добавить -L, за которым следует путь к правильному каталогу.В качестве альтернативы вам даже не нужен ключ -l для связи с библиотекой, достаточно указать полный путь к библиотеке (в данном случае реальное имя файла в том виде, в каком оно отображается в файловой системе).

Проблематакже может быть связано с путем.Например, могут возникнуть проблемы, если путь к библиотеке содержит пробелы.Если это так, вы можете попробовать поместить свои библиотечные файлы в каталог с более простым именем.

Пожалуйста, дайте некоторую обратную связь о вашей фактической конфигурации (в каком каталоге находится файл библиотеки) и о том, что вы на самом деле пытались.Вы также можете попытаться установить переменные окружения LIBS и LIBPATH (возможно, самый простой способ это сделать из make-файла).

0 голосов
/ 31 июля 2012

WindowsXP было определено в w32api.h, вам нужно #include <w32api.h> перед вашим #define WINVER.

0 голосов
/ 08 марта 2011

http://msdn.microsoft.com/en-us/library/ms738520(v=vs.85).aspx

Взгляните на материал в разделе "Замечания". Возможно, вы пытаетесь использовать версию функции ANSI-C, если вы не компилируете ее как ANSI-C.

...