C语言 对getaddrinfo的未定义引用

mf98qq94  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(142)

我已经得到这个错误相当一段时间了,现在谷歌也没有太大的帮助。
我是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

nnvyjq4y

nnvyjq4y1#

和这里的问题不一样吗?
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环境变量(最简单的方法可能是从makefile中进行设置)。

vlju58qv

vlju58qv2#

http://msdn.microsoft.com/en-us/library/ms738520(v=vs.85).aspx
看看“备注”下面的内容。有可能您正在尝试使用ANSI-C版本的函数,而不是作为ANSI-C编译。

pexxcrt2

pexxcrt23#

WindowsXP是在w32api.h中定义的,你必须在#define WINVER之前定义#include <w32api.h>

n8ghc7c1

n8ghc7c14#

另一个可能的原因是_WIN32_WINNT。检查ws2tcpip.h头文件以获得使用getaddrinfo()的最低版本。

相关问题