2011-03-07 29 views
7

he estado recibiendo este error desde hace bastante tiempo y ahora Google no ha sido de mucha ayuda.referencia indefinida a getaddrinfo

yo soy un novato a Winsock programación y tratando de aprender de los recursos en línea. Estoy intentando construir un servidor simple usando detalles en el sitio web de MSDN. Cada vez que compilo el código (MinGW), aparece el error mencionado en el título (Undefined reference to getaddrinfo). A continuación se muestra el código:

#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; 
} 

Estoy compilando con el siguiente comando:

gcc msdn_np.c -o msdn_np.exe -lWS2_32 

Respuesta

10

¿No es el mismo problema que aquí?

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

Básicamente no se olvide de enlazar con Ws2_32.lib (el mensaje es del enlazador, por lo que es debe ser la razón), sino que parecen estar haciendo eso ya.

... si está trabajando con una versión anterior de Windows, las herramientas de programación le dicen que tiene una versión superior a XP al poner #define _WIN32_WINNT 0x0501 antes de incluir encabezados (es probable que todavía no sea necesario hoy, pero tal vez).

El podría ser otros problemas simples. La convención normal (Unix) para bibliotecas es anteponerlas a lib. De ahora en adelante, el significado para -lWS32_32 sería buscar un archivo cuyo nombre es libWS32_32.a. Es probable que no lo encuentre porque le falta la ruta al directorio que contiene la biblioteca. Puede agregar una -L seguida de la ruta al directorio correcto. Alternativamente, ni siquiera necesita -l vincular con una biblioteca, simplemente poner la ruta completa a la biblioteca (en este caso, el nombre real del archivo tal como aparece en el sistema de archivos) también debería funcionar.

El problema también puede estar relacionado con la ruta. Por ejemplo, pueden ocurrir problemas si la ruta a la biblioteca contiene espacios. Si esto es así, puede intentar colocar los archivos de la biblioteca en un directorio con un nombre más simple.

Por favor, dar una cierta regeneración uso de la configuración actual (en la que el directorio es el archivo de biblioteca) y lo que en realidad se trató. También podría intentar configurar las variables de entorno LIBS y LIBPATH (la forma más simple es probablemente hacer eso desde un archivo MAKE).

+0

Pero estoy vinculación de la biblioteca ws2_32 (consulte tercer última línea OP) y todavía estoy recibiendo el problema, eso es lo que es frustrante. – check123

+0

Creo que trabajar con NPP y mingw fue complicado. Cambié a CodeBlocks y cambié la configuración del enlazador para incluir Ws2_32.dll y ahora funciona bien. ¡Gracias! – check123

0

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

Tome un vistazo a lo que hay debajo "observaciones". Es posible que intente utilizar una versión ANSI-C de la función cuando no está compilando como ANSI-C.

+0

No es útil tampoco. El error persiste Probé GetAddrInfoW, pero con poco éxito. Incluso intenté modificar el orden de los includes pero no usarlos. – check123

0

WindowsXP se definió en w32api.h, usted tiene que #include <w32api.h> antes de #define WINVER.