无法定义对 `__imp_WSACleanup' 的引用

26

这是我的第一个使用 winsock 的程序。正如您所看到的,我已经 #include <winsock2.h> 并链接了 ws2_32.dll,但代码仍无法编译:

#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);   
    }
}

这是错误信息:

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

现在我完全困惑了...


10
如果你使用的是 GCC 编译器,可以通过以下方式添加 ws2_32.lib 库文件:-lws2_32 - boleto
4
可以编译。它没有链接 - user207421
5个回答

34

您使用的编译指示符仅适用于Visual C++编译器,将被gcc忽略。

#pragma comment(lib, "ws2_32")

你需要在makefile中手动添加ws2_32.lib,例如:

-L"ws2_32"

(我猜应该是没有“.lib”后缀名)

在g++命令行的末尾。当然,你需要手动添加完整路径,而我现在并没有。


1
非常感谢,我不知道gcc会忽略#pragma指令,我使用的是Dev++,它在编译时无法添加选项,我认为我必须更换其他IDE。 - Lance
FYI,MSVC 不是唯一支持 #pragma comment(lib, ...) 的编译器。 - Remy Lebeau

15

我遇到了和你一样的问题,我通过添加命令-lwsock32来解决它。

您可以按照以下步骤添加命令:

  1. 工具
  2. 编译器选项
  3. 选择 常规
  4. 单击 在调用编译器时添加以下命令

然后您就可以添加上述命令-lwsock32


13

添加

-lwsock32

当使用MinGW编译时,可以将#pragma替换为命令行

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

6
在DevC++中,导航到 项目 >> 项目选项(或通过通常的 ctrl+h); 然后在“参数”选项卡中有一个按钮“添加库或对象”,然后添加libws2_32.a

但这将大大增加exe的大小。 - Mohit Dabas

5

针对Windows下的代码块:进入 Project -> Build Options -> Linker settings(确保在左侧选择的是项目,而非构建目标),并在左侧列表中添加(输入)库“ws2_32”

enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接