web-dev-qa-db-ja.com

C-WSAStartup @ 8への未定義の参照

私はCode :: Blocks、MinGW、およびWindowsを使用しています。プロジェクトで作業できるように、Winsockを初期化しようとしています。エラーが発生しますUndefined Reference to WSAStartup@8誰でもこれを修正する方法を知っていますか?

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

int main(int argc , char *argv[]){
    WSADATA wsa;
    int output;

    output=WSAStartup(MAKEWORD(2,2),&wsa);
    if(output != 0) {
        printf("Startup failed %d\n", output);
        return 1;
    } else {
        printf("Initialized");
        return 0;
    }

}
11
Paulo

リンカーは、コードが読み込まれた後に依存関係を探します。シンボルが必要になる前にライブラリがビルドプロセスに表示された場合、その後にソースファイルが表示されるため、シンボルは使用されず、後でソースファイルに表示されたときに解決されません。 winsockライブラリを配置します-lws2_32ソースファイルとオブジェクトファイルの後にリンクします。

gcc prog.c -o prog -lws2_32
20
4pie0

別の方法で、コンパイラーがリンクできない機能を含むライブラリーを見つけて、コンパイラーのリンカーに追加しました。ほとんどのライブラリはMINGWのlibフォルダーにあります(多くの場合C:/ MinGW/lib)。このように これらは、Dlibでいくつかのエラーが発生したときに追加するライブラリです または、不足しているlibを自動regconiteするためにこの手順を実行できます。 Code :: BlocksでのwxWidgetsプログラムのビルド

1
Kien.VietNam

ソースコードは、非常に具体的な(Microsoftのコンパイラに対して)#pragma comment(lib,"ws2_32.lib")ステートメントを使用していることを示しています。これには2つの問題があります。

  1. このプラグマはGCC(MinGWコンパイラなど)では無効であるため、コンパイル時とリンク時の両方で無視されます。
  2. MinGW(他のほとんどの(おそらくすべて?)プラットフォームのGCC規約と共通)には、「ws2_32.lib」はありません。ライブラリ(ws2_32.dllのインポートライブラリ)の正しい名前は「libws2_32.a」です。

この問題を解決するには、ソースコードでMSVC固有のプラグマに依存しないでください。むしろ、tinky_Winkyが示すように、リンクコマンドラインでライブラリを正しく指定する必要があります。

gcc prog.c -o prog.exe [...other .c and .o files...] -lws2_32 ...

(そして、指定するすべてのライブラリがafterオブジェクトファイル、またはそれらを必要とするソースファイルであることを確認してください)。

1
Keith Marshall

compiler optionsを確認し、-lws2_32add linker options when linkingに追加する必要があります。私はTDM-GCCを使用していますが、その後は問題なく動作します。

0
Runker Hamming