2012-06-04 4 views
7

私は一緒に持っている2つのオブジェクトファイルをリンクする際にGCCコンパイラが失敗しているように見えるこの問題を抱えています。両方のオブジェクトファイルfoo1.ccfoo2.ccには、foo1.hhというヘッダーファイルのクラスが含まれています。また、ヘッダファイルfoo.hhには、foo1.ccに表示されるオブジェクトインスタンスの外部宣言があります。同じヘッダファイルを使用してC++でオブジェクトファイルをコンパイルおよびリンクする方法は?

ヘッダファイルfoo.hhは、2つのソースファイルfoo1.ccfoo2.ccの間で1回のみ定義されることに注意してください。

私は、次のコマンドを使用してソースファイルをコンパイルすると、すべてが動作しているようです:

g++ foo1.cc foo2.cc 

上記のコマンドはa.outと呼ばれる実行可能ファイルを生成します。

私は独立したオブジェクト・ファイルにソースファイルをコンパイルしよう:

g++ -c foo1.cc 
g++ -c foo2.cc 
g++ -o foo1.o foo2.o 

GCCコンパイラは、関数への未定義の参照がfoo2.ccであることを訴えます。これらの関数はfoo1.ccで定義する必要があります。ただし、リンカーはそれを認識しません。

GCCコンパイラでこの問題を回避する方法があるのだろうかと思っていました。

+0

ようこそ!最も有益な答えを必ず受け入れるようにしてください。 – jncraton

+0

あなたは答えを受け入れるべきです。 – Walter

答えて

8

問題はありません.GCC構文にエラーがあります。

g++ -c foo1.cc 
g++ -c foo2.cc 
g++ -o foo foo1.o foo2.o 

-oパラメータは、出力ファイルの名前を受け入れますので、あなたの場合には、それが結合の結果とfoo1.o上書きされます。

3

最後のコマンドは、リンクコマンドです。foo2.oから実行可能ファイルを作成し、実行ファイルにfoo1.oという名前を付けます。リンカーは、foo1.oとfoo2.oの両方を使用することを意図しているため、実行可能ファイルを作成するために必要なすべての情報を見つけられない可能性があります。 -oフラグを完全に省略してください:

g++ foo1.o foo2.o 
関連する問題