2016-12-09 9 views
0

I持って他人に含まれるファイルのカップルを含めたプロジェクトC++:回避複数の定義のエラー

A.h --> B.h means A.h is included in B.h 

すべて

A.h --> X.h 
B.h --> A.h 
B.h --> X.h 

のような介在物がたくさんあります正常に動作します。今私は、私のファイルではなく、それと何かを変更することはできません)cppファイルを含める必要がある問題があります。 EDIT:この.cppファイル には、対応する.hファイルは、できるだけ早く私は、私は複数の宣言のためのコンパイラエラーを取得

Z.cpp --> B.h 

ような何かを行うようがありません。 私はまた

Z.cpp --> B.cpp 

同様の結果、私はこの.cppファイルを含めることができますどのように、単に以下のエラー(B.hは、他の多くの.hファイルに含まれている)

を試してみましたか?

編集:エラーがどこから来ているのか理解していますが、回避策があるのだろうかと思います。

+0

ソースファイルを '#include 'しないでください。それらを別々にオブジェクトファイルにコンパイルしてからリンクします。 –

+0

このcppからライブラリを作成することを意味しますか? – chrise

+0

いいえ、単一のオブジェクトファイルへのソースファイルのコンパイルのみです。 –

答えて

1

これはC++ソフトウェア開発の基本的なものです。プログラムをコンパイルしてビルドする方法については、本を読んでください。

基本的には、C++で、あなたは*のの.cppソースファイル内の* .hファイルを#include、
あなたは、各* .cppファイルをコンパイルし、
その後、通常* .oの上のリンクすべてのコンパイル済みファイル( * nixまたは* .obj)を実行可能なプログラム、またはプログラム内でリンクされるライブラリに置き換えます。

私は、*、cppファイルを#includeして別のcppファイルに入れるのは悪いことです。

QTCreatorを使用しているので、すでにこのプロセスを担当しているプロジェクトが必要です。

+0

問題は、この.cppに対応する.hファイルがないことです。それは外部ファイルなので、emがそれについて何か変更することはできません。 – chrise

+0

このcppをソースリストに含める場合は、このcppのヘッダーファイルを自分でビルドすることができます。これは、単純に他のcppファイルに転送する関数宣言のコピーです。ヘッダーファイルはコンパイラに、コンパイルされたソースの別の場所にあるこのようなメソッドを見つけることを伝える前方宣言です。そのメソッドを使用してください。 – Jonathan

2

QtCreatorを使用する場合は、プロジェクトに含まれる各ソースファイルのオブジェクトファイルをビルドする必要があります。

そのため、複数の定義エラーが発生します。たとえば、Z.oに組み込まれているソースファイルZ.cppがあります。それでがB.oに組み込まれたB.cppに含まれています。リンカーがZ.oB.oを実行可能プログラムにリンクしようとすると、Z.cppで定義されているシンボルは、の両方のオブジェクトファイルに存在し、エラーにつながります。

IDE(QtCreator)は、両方のソースファイルがビルドされてリンクされていることを確認し、1つの実行可能ファイルを作成します。 #includeソースファイルを別のソースファイル(または悪いヘッダファイル)に入れないでください。

クラス、構造体、関数プロトタイプと外部変数の宣言あなたが含まヘッダファイルに(またはでなければなりません)です。非インラインクラスまたは構造体メンバの関数と関数の実装はソースファイルにあり、コンパイラとリンカはオブジェクトファイルからそれらを参照する方法を知っています。

0

ここにコメントがあれば、自分のヘッダファイルを追加しました。問題を解決したこれを指摘してくれてありがとう。

+0

回答を受け入れるか、質問を編集するかコメントを追加する必要があります。他の回答のおかげで、あなたが問題を解決したという答えを加えないでください。 – roalz