未定义的getaddrinfo参考

时间:2011-03-07 13:16:42

标签: c winsock

我已经有很长一段时间没有得到这个错误了,谷歌也没有多大帮助。

我是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 个答案:

答案 0 :(得分:11)

这不是问题吗?

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

基本上不要忘记链接Ws2_32.lib(消息来自链接器,所以这应该是原因)但你似乎已经这样做了。

...如果你正在使用旧版本的Windows编程工具,那么你可以通过在包含标题之前添加#define _WIN32_WINNT 0x0501来获得高于XP的版本(现在不太可能仍然需要,但也许)

可能是其他简单的问题。库的正常(Unix)约定是用lib前置它们。此后,-lWS32_32的含义是搜索名称为libWS32_32.a的文件。它很可能找不到它,因为它缺少包含库的目录的路径。您可以添加-L,然后添加到正确目录的路径。或者你甚至不需要-l与库链接,只需将库的完整路径(在这种情况下是文件系统上显示的文件的真实名称)也可以工作。

问题也可能与路径有关。例如,如果库的路径包含空格,则可能会出现问题。如果是这样,您可以尝试将库文件放在名称更简单的目录中。

请使用您实际配置的一些反馈(在哪个目录中是库文件)以及您实际尝试的内容。您还可以尝试设置LIBS和LIBPATH环境变量(最简单的方法可能是从makefile中执行此操作)。

答案 1 :(得分:0)

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

看看“备注”下的内容。当您不编译为ANSI-C时,可能正在尝试使用该函数的ANSI-C版本。

答案 2 :(得分:0)

WindowsXP中定义了

w32api.h,您必须在#include <w32api.h>之前#define WINVER