2017-07-27 14 views
-1

で2つのオブジェクトファイルをリンクしながら、基本的に私のPROBはこれです。構造humanの定義は、foo.hに含まれる別のヘッダーにあります。 foo.hと他のヘッダーとcppを使用しない共有オブジェクトファイルgame.soを作成しています。複数の定義エラー同じ定義

今、2つの異なるcppファイル - a.cppb.cppがあり、ヘッダーfoo.hが含まれています。 オブジェクトファイルa.oと別にb.oを別々に作成しています。 別の共有オブジェクトファイルtennis.soを作成するためにオブジェクトファイルとgame.soの両方をリンクしていますが、その間に「人」の複数の定義を取得しています。私はa.opersonの構造体定義が含まれているので、多重定義エラーがあることを認識しています。b.oもそうです。

私は既にをfoo.hに使用しています。 a.oは別々にコンパイルされ、b.oは別々にコンパイルされています。 game.so

を作成しながら、私が何らかの依存関係に他のcppファイルにfoo.時間内構造定義のそれぞれで独立し変更カントですので、私は、#pragmaがかつてと思ういけないかa.cppb.cpp両方がfoo.h

が含まれているためIFDEFはここに有用であろうtennis.soの作成中に複数定義エラーを解決する方法はありますか?

+0

構造体の多重定義リンクエラーなどはありません。状況を再現するための正確なコードとビルドコマンド、正確なコンパイラ出力を投稿してください。 –

+0

ほとんど機密ではないので、正確なコードを投稿できませんでした。私にできることはほかにありますか? – Prz9

+0

MCVE([MCVE])を作成することができます。それは問題を再現しますが、機密情報は含まれません。あなたのヘッダが変数を宣言していないようです。変数を定義します。したがって、ヘッダーを含む各ファイルには定義が含まれており、それらが一緒にリンクされることはありません。簡単な経験則:ヘッダーで宣言された変数はキーワード 'extern'で宣言する必要があります。 –

答えて

4

person変数が1回だけ定義されていることを確認する必要があります。これを行うには、あなただけのfoo.hでその変数を宣言する必要があります:

extern human *person; 

はその後、foo.cppに、あなたはそれを定義:

human *person = NULL; 

あなたはその後、game.soを構成するオブジェクトファイルでfoo.o含まれています。

+0

私はこれをNikosを試してみましょう。 – Prz9

+0

これはNikosを使い果たしました。助けをお寄せいただきありがとうございます:) – Prz9

1

DECLARATIONとDEFINITIONを混同しているようです。ヘッダーは構造体を宣言する必要があります.C/C++はそのような宣言を使用して変数を定義したり、そのような定義[s]のインスタンスを参照したりします。

+0

Ron。定義と宣言で明確です。構造定義はヘッダー内にあることができ、M.Mによって指摘されているように多重定義エラーを作成するべきではありません。私は非常にうまくあなたのポイントは、ヘッダにあるべきではありませんし、私はいくつかの依存関係のためにヘッダから定義を削除することができないと言いました。 – Prz9

+0

修正された質問は、実際にVARIABLE定義(人間)を複製していることを示しています。人間の変数は一度定義する必要があります。それを参照するには、冗長性を避けるためにexternを使用する必要があります。なぜ変数定義(つまり、代入)がヘッダ内で行われ、変数を "所有する"モジュールではないのですか?変数がヘッダーに定義されている場合、通常は#ifdef _FROM_DEFINE_MODULE(定義)#else(extern宣言)で保護する必要があります。#endif –

+0

はい。助けをありがとう:) – Prz9