2013-09-01 25 views
5

Questo è il mio primo programma con winsock. Come potete vedere, ho #include <winsock2.h> e collegato ws2_32.dll, ma il codice ancora non viene compilato correttamente:riferimento non definito a `__imp_WSACleanup '

#include<winsock2.h> 
#pragma comment(lib, "ws2_32") 
class CInitSock{ 
public: 

    CInitSock(BYTE minorVer=2,BYTE majorVer=2){ 
     //initialize WS2_32.dll 
     WSADATA wsaData; 
     WORD sockVersion = MAKEWORD(minorVer,majorVer); 
     if(::WSAStartup(sockVersion,&wsaData)!=0){ 
      exit(0); 
     } 
    } 
    //release winSock libary 
    ~CInitSock(){ 
     ::WSACleanup(); 
    } 
}; 

#include "CInitSock.h" 
#include<stdio.h> 
CInitSock initSock; 
int main(void){ 
    char szHost[256]; 
    ::gethostname(szHost,256); 
    hostent *phost = ::gethostbyname(szHost); 
    in_addr addr; 
    for(int i = 0;;i++){ 
     char *p = phost->h_addr_list[i]; 
     if(p==NULL){ 
      break; 
     } 
     memcpy(&addr.S_un.S_addr,p,phost->h_length); 
     char *szIp = ::inet_ntoa(addr); 
     printf("%s \n",szIp); 
    } 
} 

Questo è l'errore:

mingw32-make.exe -f "D:\project\c_program\Makefile.win" all 
g++.exe GetAllIPs.o -o win_socket.exe -L"D:/tools/develepment/Dev-Cpp/MinGW64/x86_64- w64-mingw32/lib" -L"D:/tools/develepment/Dev-Cpp/MinGW64/lib32" -static-libgcc -mwindows -g3 


GetAllIPs.o: In function `main': 
D:\project\c_program/GetAllIPs.cpp:6: undefined reference to `__imp_gethostname' 
D:\project\c_program/GetAllIPs.cpp:7: undefined reference to `__imp_gethostbyname' 
D:\project\c_program/GetAllIPs.cpp:15: undefined reference to `__imp_inet_ntoa' 
GetAllIPs.o: In function `CInitSock::CInitSock(unsigned char, unsigned char)': 
D:\project\c_program/CInitSock.h:10: undefined reference to `__imp_WSAStartup' 
GetAllIPs.o: In function `CInitSock::~CInitSock()': 
D:\project\c_program/CInitSock.h:16: undefined reference to `__imp_WSACleanup' 
collect2.exe: error: ld returned 1 exit status 

mingw32-make.exe: *** [win_socket.exe] Error 1 

Ora io sono totalmente confuso ...

+2

Se si utilizza 'GCC' provare aggiungere' ws2_32.lib' in in questo modo: '-lws2_32' – boleto

+0

Esso * fa * compila. Non * link. * – EJP

risposta

9

il pragma di utilizzare solo lavora per il Visual C++ Compiler e verrà ignorato dal gcc

#pragma comment(lib, "ws2_32") 

devi aggiungere manualmente il ws2_32.lib nel makefile. come:

-L"ws2_32" 

(credo che fosse senza la "Lib" alla fine)

alla fine della linea g ++. Ovviamente hai aggiunto il percorso completo che non ho ancora in mano al momento.

+0

grazie mille, non sapevo che gcc ignorerà il pragma, io uso il dev ++, non posso aggiungere l'opzione quando si compila, penso di dover cambiare un altro ide. – user2682541

3

In DevC++, passare a Progetto >> Opzioni progetto (o tramite solito Ctrl +h); quindi nella scheda "Parametri" c'è un pulsante "Aggiungi libreria o oggetto" e quindi aggiungere libws2_32.a.

+0

ma aumenterà drasticamente la dimensione di exe –

1

Ho incontrato lo stesso problema con voi. L'ho risolto aggiungendo un comando -lwsock32. è possibile aggiungere i passi successivi di comando secondo:

  1. strumenti
  2. opzioni di compilazione
  3. scegliere general
  4. click add the following commands when calling the compilers

quindi è possibile aggiungere il comando sopra -lwsock32.

0

aggiungere

-lwsock32 

al vostro riga di comando invece di #pragma quando si compila con MinGW

g++ src/main.cpp -o release/myApp.exe -lwsock32 
Problemi correlati