1

ネットワーク コードを C++ アプリケーションに含めようとしています。CSimpleSocketをダウンロードし、すべての .h ファイルと .cpp ファイルをメイン ファイルがあるディレクトリにコピーしました。次に、ヘッダーの 1 つをインクルードしようとしましたが、リンカーは次のような一連のエラーを表示するだけです。

  • [リンカ エラー] CPassiveSocket::CPassiveSocket(CSimpleSocket::CSocketType) への未定義の参照'
  • [リンカ エラー] `CSimpleSocket::Initialize()' への未定義の参照
  • [リンカー エラー] 「CPassiveSocket::Listen(unsigned char const*, short, int)」への未定義の参照
  • [リンカ エラー] `CPassiveSocket::Accept()' への未定義の参照

その他。すべてが 1 つのディレクトリにあるので、それは問題ではないと思います。含めるために使用しているコードは#include "PassiveSocket.h". 違いがある場合は、Dev-C++ を使用しています。私は自分が間違っていることを理解していないので、誰かが私を助けることができれば、それは素晴らしいことです.

これが本当にばかげた質問であれば許してください。しかし、私は C++ を学ぼうとしていますが、それは簡単ではありません。ご協力いただきありがとうございます。

4

1 に答える 1

4

このエラーが発生する理由は、コンパイラが CSimpleSocket ヘッダーに対応するバイナリを見つけられないためです。書いたかのように

void someFunction(int someArg);

そして、 someFunction の実装を提供したことはありません。

サードパーティのライブラリを使用するには、次の 2 つが必要です。

  • ヘッダー ファイル (.h、.hpp など)
  • ライブラリ ファイル (.a、.lib など)

ヘッダー ファイルとライブラリ ファイルを取得したら、それらをコンパイラが見つけられる場所に配置する必要があります。この場所は、OS、環境変数、およびコンパイラの構成によって異なります。

コンパイラがそれらを見つけることができる場所にあるので、コンパイラにそれらを使用するように指示する必要があります。ヘッダー ファイルは #include コマンドで使用され、ライブラリ ファイルはコンパイラに引数を提供することでリンクされます。

舞台裏で Dev-C++ は MinGW GNU GCC コンパイラをg++ file1.cpp file2.cpp ... filen.cpp -o filename使用し、ファイル 1 から n を使用して「filename」という名前の C++ 実行可能ファイルをコンパイルするようプログラム g++ に指示するのと同様のコマンドを呼び出します。どこで検索し、何をリンクするかを指定するなど、g++ に追加できるフラグは他にもあります。

コンパイル時の CSimpleSocket ライブラリの名前は「clsocket」であるため、Dev-C++ を構成-lclsocketしてg++コマンドに追加する方法を見つける必要があります。私は Dev-C++ を使用していないため、ここでお手伝いすることはできませんが、おそらくコンパイル構成で「リンク オプション」などを探しているでしょう。また、.lib および .h ファイルが検索パス上にあることを確認する必要があります。これは、Dev-C++ でも構成できる必要があります。

CSimpleSocket は、.lib ファイルを自動的に作成し、.lib と .h を見つけられる場所に配置するインストーラーも提供します。そのインストーラーの使用を検討する必要があります。

この回答の複雑さは、C++ ライブラリ統合エコシステムのひどい状態を浮き彫りにしていると思います。残念ながら、執筆時点では C++ に「モジュール」という概念はありません。

于 2013-01-07T02:31:35.653 に答える