2009-04-06 66 views
1

私はLNK2005を取得しています:Visual Studio 2008でプロジェクトをビルドするときに(...)エラーで既に定義されています。私は他の関連する質問を参照しましたが、私が扱っているファイルの数に他のものがなければ、もっと複雑になります。すべての私のヘッダファイルがでガードされている複雑なエラーLNK2005:既に定義済みC++

includes_this_file> - まず

は、私は私が形式[current_file]で、私は私のプロジェクトのファイルを持っているの#include文をマップすることが参考になると思います標準#ifndef [ヘッダー] #define [ヘッダー] ... #endif。変調クラスの

[Modulator.h]

プロトタイプ

[ChorusUnit.h] - > Modulator.h型変調器のメンバオブジェクトを持つコーラスクラスの

プロトタイプ

[AudioHandler.h] - > ChorusUnit.h

Chorusクラスのメンバオブジェクトを持つAudioHandlerクラスのプロトタイプ

[Chorus.cpp] - > AudioHandler.h

モジュレーターのメンバーの定義とコーラスクラス

[AudioHandler.cpp] - のメンバーの> Chorus.cpp

定義AudioHandlerクラス

[ChorusUnit.cpp] - > AudioHandler.cpp

実際のコードを実行するmain()関数を含むファイル私のプロジェクト。

これは、Modulator.h、ChorusUnit.h、AudioHandler.hにあるクラスのすべての関数定義が他のクラスのメンバを参照する必要があるため、すべてのプロトタイプを最初に定義する必要があるためですクラスはお互いに見える。

エラーは、特に、ファイルChorus.objのChorus.cppとAudioHandler.cppにあるすべての単一定義がAudioHandler.objで既に定義されていることを示しています。 また、ChorusUnit.objファイルのChorus.cppとAudioHandler.cppにあるすべての単一定義がAudioHandler.objですでに定義されているという同じエラータイプの別のセットがあります。

おそらくかなり簡単な解決策がありますが、私は一般にリンクする際に特に経験はありません(主にJavaプログラマー)。私の限られた知識がある限り、私はすべてを一度定義しただけです。すべてが一度しか含まれていなかったので、私は個人的にこれらがすでに定義されている理由を犠牲にしています。いくつか私を啓発してください!

答えて

9

おそらくAudioHandle.cppにChorus.cppを#includeしていると言われていますが、これはおそらくあなたが望むものではありません。

理由は、すべての.cppファイル(IDEで特別なことをしていない限り)が別々にコンパイルされてリンクされているからです。別の.cppファイルを#includeすると、ファイルのテキストがそのまま含まれます。したがって、インクルードされたファイルに定義されているすべてのオブジェクトもインクルードファイルに表示されます。 2つのファイルをリンクすると、共通オブジェクトによって競合が発生します。

+0

私は#include [header]を.cppに入れませんが、まだリンクに問題があります! さらにクラスを持たないファイルのクラスに対してエラーを返します。まだ動作していない新しいソリューションにファイルを移動しようとしましたT_T – Katia

3

[AudioHandler.cpp] - AudioHandlerクラスのメンバーのために> Chorus.cpp

定義

これは間違っています。プロトタイプにはChorusUnit.hppを含めてください。

+0

私はChorus.cppの名前をChorus.hppに変更する必要がありますか?私はまだ私のプロジェクトにこの名前のファイルを持っていません。 – Rich

+0

それはChorusUnit.hです - Chorus.cppで定義された関数のプロトタイプを含むファイル – dirkgently

+0

ああ、大丈夫です。分かったと思います。ヘッダファイルをインクルードしているときに、ヘッダをインクルードしてからコンパイラ/リンカが独自に行うため、.cppファイルの定義を参照する必要はありません。 – Rich

2

AudioHandler.cppとChorusUnit.cppは、他のC++ソースファイルだけを#includeする必要があります。

プリプロセッサは#includingファイルの内容を#includingファイルに挿入するので、Chorus.cppをコンパイルしたときとAudioHandlerをコンパイルしたときの2つのコードをChorus.cppから取得することができます。 cpp(Chorus.cppを#includeしているので)。

0

私はWindowsマシンでこれを行う方法がわかりませんが、これらの問題は通常、Cプリプロセッサを使用してコードを実行することで解決できます。これにより、組み合わされたソースファイルは、基本的にすべての "#include"ステートメントを、それらが参照するファイルに置き換えられます。この結合されたファイルを見ると、どこで物事が再定義されているのかが明らかになります。 Linux/Unixでは、これは 'cpp'コマンドを使って行います。

関連する問題