8

私が持っている2つのオブジェクトファイルをリンクすることになると、GCCコンパイラが失敗しているように見えるこの問題が発生しています。オブジェクトファイルfoo1.ccfoo2.ccインクルードクラスの両方が、と呼ばれるヘッダーファイルのクラスですfoo1.hh。さらに、ヘッダーファイルfoo.hhには、に表示されるオブジェクトインスタンスの外部宣言がありますfoo1.cc

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

次のコマンドを使用してソースファイルをコンパイルすると、すべてが機能しているように見えます。

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コンパイラでこの問題を回避する方法があるかどうか疑問に思いました。

4

2 に答える 2

10

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

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

パラメータは出力ファイルの名前を受け入れるため-o、この場合、リンクの結果でfoo1.oが上書きされます。

于 2012-06-04T15:46:29.980 に答える
4

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

g++ foo1.o foo2.o
于 2012-06-04T15:48:48.127 に答える