次のC++プログラムを実行しようとすると:UPDATE(過去のリンクにエラーがあったために更新されたコード):http://pastie.org/private/pdpfpzg5fk7iegnohebtq
私は次のようになります:
アップデート
現在発生しているエラーは次のとおりです。
それについて何かアイデアはありますか?
ありがとう。
次のC++プログラムを実行しようとすると:UPDATE(過去のリンクにエラーがあったために更新されたコード):http://pastie.org/private/pdpfpzg5fk7iegnohebtq
私は次のようになります:
アップデート
現在発生しているエラーは次のとおりです。
それについて何かアイデアはありますか?
ありがとう。
コンストラクター定義の場所をコンパイラーに指示しませんでしたGradeBook
(したがって、「未定義の参照」)。すべてのソースファイルを個別にコンパイラに渡すか、すべてのコンパイルユニットの中間オブジェクトファイルを作成して、それらをリンクする必要があります。
事実上、最も簡単な解決策はこれです:
g++ GradeBookMain.cc GradeBook.cc -o GradeBookMain
GradeBook.oでリンクしていないため、未定義の参照を取得しています。試す
g++ GradeBookMain.cc GradeBook.cc -o GradeBookMain
GradeBook.hに「maximum」ではなく「maximun」というタイプミスもあります。
私のお気に入りのIRCボットの1つを引用すると、未定義の参照はリンカーエラーです。コンパイルエラーではありません。#includesは役に立ちません。エラーメッセージで物事を定義しなかった、それを定義するファイルをリンクするのを忘れた、それを定義するライブラリにリンクするのを忘れた、または静的ライブラリの場合、リンカーコマンドラインで間違った順序になっている。どれを確認してください。
C++では大文字と小文字が区別されます。したがって、たとえばdisplayMessageを使用できますが、定義するのはDisplayMessageです。これらは2つの異なる機能です。DisplayMessageの定義をdisplayMessageに変更するか、それを呼び出すときにdisplayMessageではなくDisplayMessageを呼び出す必要があります
コンパイラが教えてくれるのは、GradeBookクラスが定義されており、コンパイル段階ではすべて問題ないということですが、完全な実行可能プログラムをリンクするときは、そのクラスの実際のコードを見つけることができません。これは、GradeBook.ccではなくGradeBookMain.ccのみをコンパイルしてリンクしたためです。次のように、両方を同時にコンパイルしてリンクすることができます。
g++ GradeBookMain.cc GradeBook.cc -o program
または、それらを個別にコンパイルしてから、一緒にリンクすることもできます。
g++ -c GradeBookMain.cc -o GradeBookMain.o
g++ -c GradeBook.cc -o GradeBook.o
g++ GradeBookMain.o GradeBook.o -o program
GradeBook.ccでもコンパイルする必要があります。
現時点では、クラス自体がコンパイルまたはリンクされていないため、リンカはGradeBookクラスを見つけることができず、文句を言います。