web-dev-qa-db-ja.com

`__imp_WSACleanup 'への未定義の参照

これは、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

今、私は完全に混乱しています...

13
user2682541

使用するプラグマはVisual C++コンパイラーでのみ機能し、gccによって無視されます

#pragma comment(lib, "ws2_32")

ws2_32.libをmakefileに手動で追加する必要があります。お気に入り:

-L"ws2_32"

(最後に「.lib」がなかったと思います)

g ++行の終わり。もちろん、現時点では手作業ではない完全なパスを追加する必要があります。

20
Martin Schlott

あなたと同じ問題に遭遇しました。コマンド-lwsock32を追加して解決しました。次の手順に従ってコマンドを追加できます。

  1. ツール
  2. コンパイラーオプション
  3. generalを選択します
  4. add the following commands when calling the compilersをクリックします

次に、上記のコマンド-lwsock32を追加できます。

5
L.ling

DevC++で、Project >> Project Options(または通常は ctrl+h);次に、 "Parameters"タブにボタン "Add Library or Object"があり、次にlibws2_32.a

4
Walterti

追加

-lwsock32

command-lineの代わりに#pragmaMinGWでコンパイルする場合

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