【问题标题】:undefined reference to `__imp_WSACleanup'对“__imp_WSACleanup”的未定义引用
【发布时间】:2013-09-01 13:44:55
【问题描述】:

这是我第一个使用 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

现在我完全糊涂了……

【问题讨论】:

  • 如果您使用GCC,请尝试以这种方式添加ws2_32.lib-lws2_32
  • 确实编译。它没有链接。

标签: c++ c winsock2


【解决方案1】:

您使用的编译指示仅适用于 Visual C++ 编译器,并且会被 gcc 忽略

#pragma comment(lib, "ws2_32")

您必须在 makefile 中手动添加 ws2_32.lib。 喜欢:

-L"ws2_32"

(我猜它最后没有“.lib”)

在 g++ 行的末尾。您当然已经添加了我目前没有手动添加的完整路径。

【讨论】:

  • 非常感谢,我不知道gcc会忽略pragma,我用的是dev++,编译时无法添加选项,我想我必须换一个ide。
【解决方案2】:

我遇到了同样的问题。我通过添加命令-lwsock32 解决了这个问题。 您可以按照以下步骤添加命令:

  1. 工具
  2. 编译器选项
  3. 选择general
  4. 点击add the following commands when calling the compilers

那么你可以添加上面的命令-lwsock32

【讨论】:

    【解决方案3】:

    添加

    -lwsock32
    
    使用 MinGW 编译时,

    到您的 命令行 而不是 #pragma

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

    【讨论】:

      【解决方案4】:

      在 DevC++ 中,导航到 Project >> Project Options(或通常通过 ctrl+h);然后在“Parameters”选项卡中有一个“Add Library or Object”按钮,然后添加libws2_32.a

      【讨论】:

      • 但它会大幅增加 exe 的大小
      【解决方案5】:

      对于 wnidows 下的代码块:转到

      项目 -> 构建选项 -> 链接器设置(确保在左侧选择项目,而不是构建目标)并在左侧列表中添加(输入)库“ws2_32”

      【讨论】:

        猜你喜欢
        • 2016-12-10
        • 2011-03-27
        • 2022-01-22
        • 2016-04-04
        • 2015-11-03
        • 2011-08-11
        • 2019-07-22
        • 2015-07-20
        • 2019-06-22
        相关资源
        最近更新 更多