C 对getaddrinfo的未定义引用

C 对getaddrinfo的未定义引用,c,winsock,C,Winsock,我已经有相当一段时间出现这个错误了,谷歌也没有太大的帮助 我是Winsock编程的新手,试图从在线资源中学习。我正在尝试使用MSDN网站上的详细信息构建一个简单的服务器。每当我编译代码(MinGW)时,我都会得到标题中提到的错误(对getaddrinfo的未定义引用)。代码如下: #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #define WINVER WindowsXP #include <windows

我已经有相当一段时间出现这个错误了,谷歌也没有太大的帮助

我是Winsock编程的新手,试图从在线资源中学习。我正在尝试使用MSDN网站上的详细信息构建一个简单的服务器。每当我编译代码(MinGW)时,我都会得到标题中提到的错误(
对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;
}  

这不是和这里一样的问题吗

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

。。。如果您使用的是旧版本的windows编程工具,请告诉它您的版本高于XP,方法是在包含标题之前添加
#define(定义)WINNT 0x0501
(现在不太可能仍然需要,但可能需要)

问题可能是其他简单的问题。库的常规(Unix)约定是在它们前面加上lib。从今以后,-lWS32_32的意思就是搜索名为
libWS32_32.a
的文件。它很可能找不到它,因为它缺少指向包含库的目录的路径。您可以添加一个-L,后跟正确目录的路径。或者,您甚至不需要-l来链接库,只需将完整路径放到库中(在本例中,文件系统中显示的文件的真实名称)也可以

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

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


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

WindowsXP
是在
w32api.h
中定义的,您必须在
\define WINVER

之前包含
,但我正在链接库Ws2\u 32(请参阅OP中的最后三行)但我还是遇到了问题,这是令人沮丧的。我想与NPP和mingw合作是很棘手的。我改为CodeBlocks,并将链接器设置改为包含Ws2_32.dll,现在工作正常。谢谢也没用。错误一直存在。尝试了GetAddrInfoW,但收效甚微。甚至尝试修改includes的顺序,但都没有用。
gcc msdn_np.c -o msdn_np.exe -lWS2_32