0

私はゲーム プログラムを持っていますが、非常にイライラしています。すべてが正常に動作していたので、関数のセットごとに個別のファイルを作成して、プログラムをクリーンアップすることにしました。コードは非常に長く、複数のファイルがありますが、基本的な考え方は次のとおりです。

Windows XP で Code::Blocks IDE を使用しています

私のentity.hIveでは、そのクラスのすべての関数と変数を宣言しました。私のentity.cppアイブには、他のすべてのファイルと同様にそれが含まれています。しかし、私はまだエンティティ.hのすべてのメソッドと他のすべてのヘッダーファイルへの未定義の参照があることを示すエラーの膨大なリストを取得しています。たとえば、印刷を簡単にする関数呼び出しがあり、それがファイルprint()から呼び出す最初のメソッドです。entity.h次のエラーが表示されます。

print() のコードは次のとおりです。

void print(string f) {
 cout<<f<<endl;
} 

どのように私はそれを呼んでいます:

void Player::win(){
entity e;
e.print("You have defeated the orc");

} エラー:

関数 'ZN6Player3winEv': 'entity::print(std::string)' への未定義の参照

はい、私はのを持っていobjectますentity

4

4 に答える 4

3

Undefined referenceエラーは (コンパイル時ではなく) リンク時に発生します。あなたのコードは正しくコンパイルされているように見えるので、ヘッダーはおそらく正しいでしょう。しかし、実行可能ファイルを作成するためにすべてをリンクしているわけではありません。プラットフォーム、コンパイラ、またはビルド システムについて言及していないため、正確な修正方法を説明することはできませんが、一般に、コンパイラは*.oファイルごとにファイルを生成し (コンパイル)、ファイルを*.cppリンクして、*.o実行可能ファイルを作成します。すべてのファイルが一緒にリンクされていることを確認する必要があります(また、ファイルの 1 つをファイルに*.oコンパイルしていない場合もあります)。*.cpp*.o

于 2012-10-13T20:06:42.563 に答える
1

entity.o簡単に推測すると、ファイルをバイナリにリンクしていません。

Linux g++ を使用している場合は、次のようになります。

g++ -o binary entity.cpp game.cpp

cpp ファイルをコンパイルしてバイナリにリンクする必要があります。

Code::Blocks特定のビルド グループ内にあるファイルを選択するには、ターゲット アプリケーションを右クリックして を選択する必要がありますproperties。これにより、ポップアップが表示されProject/target optionsます。タブに移動しBuild Targetsます。ページの右下の方に のリストがありBuild target filesます。実行可能ファイルに寄与するすべてのファイルがビルド ターゲットの一部として選択されていることを確認する必要があります。これは、entity.cpp ファイルにチェックボックスが必要であることを意味します。これにより、コードを含むファイルentity::printがコンパイルされ、ターゲットの実行可能ファイルにリンクされます。タブは、左側のリストでBuild target files選択したものに適用されることに注意してください。ファイルが属するbuild targetすべてのファイルがチェックされていることを確認する必要があります。build targets

一般に、Code::Blocks にファイルを追加するとき、およびファイルを追加するターゲットのチェックボックスが表示されている場合、新しいファイルが属するすべてのターゲットがチェックされていることを確認する必要があります。ウィザードのデフォルトでは、すべてのチェックボックスをオフのままにします。あなたの場合、それは単純なプロジェクトであるため、ターゲットごとにチェックされていることを確認する必要があります(通常、2 つのターゲットとしてデバッグとリリースから開始します)。

于 2012-10-13T20:04:32.533 に答える