0

作成中のゲームで UDP 接続を確立しようとしています。ソケットへの入力は 2 番目のスレッドを介して読み取られるため、メッセージを待機している間もゲームを実行し続けることができます。別のプロジェクトで動作するようになりましたが、ゲーム コードに移植すると、未解決の外部シンボル エラーが発生します。

LNK2019: 未解決の外部シンボル "void __cdecl receiveThread(void *)" (?receiveThread@@YAXPAX@Z) が関数 "public: bool __thiscall Network::setupServerUDP(void)" (?setupServerUDP@Network@@QAE_NXZ) で参照されています。

私はこれをグーグルで検索しましたが、誰もがランタイム ライブラリをマルチスレッドに設定する必要があると言っています。 . どこかで間違ったものに設定されたばかげたオプションだと確信しています。ただ、それが何なのか、ちょっと思いつきません。

ws2tcpip.h をインクルードし、正しいライブラリにリンクしました: #pragma comment(lib, "Ws2_32.lib")。

テスト プロジェクトとゲーム プロジェクトの唯一の違いは、テスト プロジェクトがコンソール アプリケーションで、もう一方が Windows アプリケーションであることですが、それが問題になる理由がわかりません。考え?

ご協力いただきありがとうございます!

乾杯、

マキシム

4

2 に答える 2

1

未解決の関数は ではなく_beginthreadreceiveThreadです。それがあなたの関数です - へのパラメーターとして提供するスレッド エントリ ポイントです_beginthread。その関数を正しい呼び出し規約で作成しましたか? それは本当にcdeclですか?cdecl として宣言し、明示的な呼び出し規約なしで実装すると、このようなリンク エラーが発生します。たとえば、次のコードはリンク エラーを引き起こします。

extern "C" { void receiveThread(void*); } //There's a cdecl function somewhere

//...

_beginthread(receiveThread, 0, 0); //Let's refer to it

//...

void receiveThread(void *p) //But this is not it! It's stdcall.
{
     //Do something
}

修正するには、 の実装がreceiveThreadcdecl 規則を使用しているか、 として宣言されていることを確認してくださいextern "C"

記録として、_beginthreadexcdecl ではなく stdcall 関数が必要です。では_beginthreadex、規則について心配する必要はありません。

于 2012-07-03T15:09:32.473 に答える
0

receiveThreadエラーは、ws2tcpip.h で宣言されていると推測している関数の実装をリンカが見つけられないことを示しています。

実装が含まれている場合Ws2_32.libは、Visual Studio を使用していると仮定して、プロジェクトのプロパティ メニューの下のリンカ -> 追加の依存関係 -> 入力に追加してみてください。

于 2012-07-03T15:10:32.070 に答える