私は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;
}
}
リンカーは、コードが読み込まれた後に依存関係を探します。シンボルが必要になる前にライブラリがビルドプロセスに表示された場合、その後にソースファイルが表示されるため、シンボルは使用されず、後でソースファイルに表示されたときに解決されません。 winsockライブラリを配置します-lws2_32
ソースファイルとオブジェクトファイルの後にリンクします。
gcc prog.c -o prog -lws2_32
別の方法で、コンパイラーがリンクできない機能を含むライブラリーを見つけて、コンパイラーのリンカーに追加しました。ほとんどのライブラリはMINGWのlibフォルダーにあります(多くの場合C:/ MinGW/lib)。このように これらは、Dlibでいくつかのエラーが発生したときに追加するライブラリです または、不足しているlibを自動regconiteするためにこの手順を実行できます。 Code :: BlocksでのwxWidgetsプログラムのビルド
ソースコードは、非常に具体的な(Microsoftのコンパイラに対して)#pragma comment(lib,"ws2_32.lib")
ステートメントを使用していることを示しています。これには2つの問題があります。
この問題を解決するには、ソースコードでMSVC固有のプラグマに依存しないでください。むしろ、tinky_Winkyが示すように、リンクコマンドラインでライブラリを正しく指定する必要があります。
gcc prog.c -o prog.exe [...other .c and .o files...] -lws2_32 ...
(そして、指定するすべてのライブラリがafterオブジェクトファイル、またはそれらを必要とするソースファイルであることを確認してください)。
compiler options
を確認し、-lws2_32
をadd linker options when linking
に追加する必要があります。私はTDM-GCCを使用していますが、その後は問題なく動作します。