2013-09-01 64 views
5

Đây là chương trình đầu tiên của tôi với winsock. Như bạn thấy, tôi đã #include <winsock2.h> và liên kết ws2_32.dll, nhưng mã vẫn không biên dịch:tham chiếu không xác định đối với `__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); 
    } 
} 

Đây là lỗi:

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 

Bây giờ tôi hoàn toàn nhầm lẫn ...

+2

Nếu bạn sử dụng 'GCC' thử thêm 'ws2_32.lib' trong theo cách này: '-lws2_32' – boleto

+0

Nó * làm * biên dịch. Nó không * liên kết. * – EJP

Trả lời

9

các pragma bạn sử dụng chỉ hoạt động cho Visual C++ Compiler và sẽ bị bỏ qua bởi các gcc

#pragma comment(lib, "ws2_32") 

bạn phải thêm ws2_32.lib nó theo cách thủ công vào makefile. như:

-L"ws2_32" 

(Tôi đoán nó là nếu không có sự "lib" ở cuối)

vào cuối g ++ dòng. Bạn có tất nhiên thêm đường dẫn đầy đủ mà tôi không có bằng tay vào lúc này.

+0

cảm ơn bạn rất nhiều, tôi không biết rằng gcc sẽ bỏ qua pragma, tôi sử dụng dev ++, nó không thể thêm tùy chọn khi biên dịch, tôi nghĩ rằng tôi phải thay đổi một ide khác. – user2682541

3

Trong DevC++, điều hướng đến Dự án >> Tùy chọn Project (hoặc thông qua thường ctrl +h); sau đó trong tab "Tham số" có nút "Thêm thư viện hoặc đối tượng" và sau đó thêm libws2_32.a.

+0

nhưng nó sẽ tăng kích thước của exe mạnh –

1

Tôi đã gặp vấn đề tương tự với bạn. Tôi đã giải quyết nó bằng cách thêm một lệnh -lwsock32. bạn có thể thêm các bước sau lệnh theo:

  1. cụ
  2. tùy chọn biên dịch
  3. chọn general
  4. nhấp chuột add the following commands when calling the compilers

sau đó bạn có thể thêm các lệnh trên -lwsock32.

0

thêm

-lwsock32 

để bạn dòng lệnh thay vì #pragma khi biên dịch với MinGW

g++ src/main.cpp -o release/myApp.exe -lwsock32 
Các vấn đề liên quan