2015-09-30 38 views
0

我試圖創建一個真正基本的客戶端應用程序,基於msdn上的代碼,但我得到了標題中的錯誤。 下面是完整的代碼:隱式聲明的函數'getaddrinfo'與Mingw的Windows

#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。

另外:爲什麼我得到「忽略編譯指示」錯誤?謝謝。

回答

2

關於

warning: ignoring #pragma comment [-Wunknown-pragmas] #pragma comment (lib, "Ws2_32.lib")

#pragma comment(lib,"xxx.lib")是微軟的C/C++編譯器具體。 GCC不支持它。

關於

implicit declaration of function

只需#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文件。

+0

我應該刪除它嗎?沒有它會起作用嗎? –

+0

是的,你應該,因爲被忽略了。 – LPs

+0

@FedericoPonzi我編輯了第二個問題。 – LPs