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