对 getaddrinfo 的未定义引用

Posted

技术标签:

【中文标题】对 getaddrinfo 的未定义引用【英文标题】:Undefined reference to getaddrinfo 【发布时间】:2011-03-07 13:16:42 【问题描述】:

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

我是 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

【问题讨论】:

【参考方案1】:

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

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 进行设置)。

【讨论】:

但我正在链接库 Ws2_32(请参阅 OP 中的倒数第三行),但我仍然遇到问题,这令人沮丧。 我想与 NPP 和 mingw 一起工作很棘手。我更改为 CodeBlocks,并将链接器设置更改为包含 Ws2_32.dll,现在它工作正常。谢谢!【参考方案2】:

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

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

【讨论】:

也没有帮助。错误持续存在。尝试了 GetAddrInfoW,但收效甚微。甚至尝试修改包含的顺序但没有用。【参考方案3】:

WindowsXP 是在w32api.h 中定义的,您必须在#define WINVER 之前添加#include &lt;w32api.h&gt;

【讨论】:

以上是关于对 getaddrinfo 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

对静态成员的未定义引用

对现有类的未定义引用

键入对 `cv::fastFree(void*)' 的未定义引用

对“cvCreateBGCodeBookModel”的未定义引用

对函数 Android NDK 的未定义引用

对 vtable 的未定义引用(继承)