隐含的功能声明' getaddrinfo'在Windows上使用Mingw

时间:2015-09-30 11:17:13

标签: c windows

我试图根据msdn上的代码创建一个真正基本的客户端应用程序,但我在标题中得到了错误。 这是完整的代码:

#include <tchar.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment (lib, "Ws2_32.lib")
#define DEBUG 1


#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "9001"

void CreateSocket();
int main(int argc, char* argv[])
{
    CreateSocket();


    return 0;
}


void CreateSocket()
{
    WSADATA wsaData;
    SOCKET ConnectSocket = INVALID_SOCKET;
    struct addrinfo *result = NULL,
                    *ptr = NULL,
                    hints;
    char *sendbuf = "this is a test";
    int iResult;

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

    ZeroMemory( &hints, sizeof(hints) );    

    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    iResult = getaddrinfo("127.0.0.1", DEFAULT_PORT, &hints, &result);
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
            ptr->ai_protocol);

    iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);

    freeaddrinfo(result);
    iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );

    closesocket(ConnectSocket);
    WSACleanup();

}

我在Windows 10上使用MinGW。 这是完整的编译和错误:

gcc -Wall -o "test" "test.c" -lws2_32 (nel direttorio: C:\Users\FedericoPonzi\Google Drive\Programmazione\C\ProgrammazioneDiSistema\FedericoPonzi-programmazionedisistema-40c332bcd001\FedericoPonzi-programmazionedisistema-40c332bcd001\Prove)
test.c:10:0: warning: ignoring #pragma comment  [-Wunknown-pragmas]
 #pragma comment (lib, "Ws2_32.lib")
 ^
test.c: In function 'CreateSocket':
test.c:46:2: warning: implicit declaration of function 'getaddrinfo' [-Wimplicit-function-declaration]
  iResult = getaddrinfo("127.0.0.1", DEFAULT_PORT, &hints, &result);
  ^
test.c:52:2: warning: implicit declaration of function 'freeaddrinfo' [-Wimplicit-function-declaration]
  freeaddrinfo(result);
  ^
test.c:35:6: warning: variable 'iResult' set but not used [-Wunused-but-set-variable]
  int iResult;
      ^
C:\Users\FEDERI~1\AppData\Local\Temp\ccAW2c9I.o:test.c:(.text+0xbb): undefined reference to `getaddrinfo'
C:\Users\FEDERI~1\AppData\Local\Temp\ccAW2c9I.o:test.c:(.text+0x11b): undefined reference to `freeaddrinfo'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\FEDERI~1\AppData\Local\Temp\ccAW2c9I.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
Compilazione fallita.

我使用Geany作为IDE。

另外:为什么我得到了&#34;忽略了pragma&#34;错误?感谢。

1 个答案:

答案 0 :(得分:3)

关于

  

警告:忽略#pragma comment [-Wunknown-pragmas]    #pragma comment(lib,&#34; Ws2_32.lib&#34;)

#pragma comment(lib,"xxx.lib")是特定于Microsoft c / c ++编译器的。 海湾合作委员会不支持它。

关于

  

隐含的功能声明

由于

,在您加入之前只需#define _WIN32_WINNT 0x0501
#if (_WIN32_WINNT >= 0x0501)
void WSAAPI freeaddrinfo (struct addrinfo*);
int WSAAPI getaddrinfo (const char*,const char*,const struct addrinfo*,
                struct addrinfo**);
int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
               char*,DWORD,int);
#else
/* FIXME: Need WS protocol-independent API helpers.  */
#endif

ws2tcpip.h档案中。