リンカ・ローダと実行形式
C言語のプログラムをリンクしたときに「undefined reference to `foo'」(fooへの未定義の参照)というエラーが出た。最も考えられる原因はどれか。
- Afooの中に文法の誤りがある
- Bfooを2つのファイルで定義している
- Cfooを呼んでいるが、fooの中身を定義したファイルやライブラリがリンクに含まれていない
答えと解説を見る
正解:C. fooを呼んでいるが、fooの中身を定義したファイルやライブラリがリンクに含まれていない
ヘッダファイルで関数を宣言していれば、コンパイルは通ります。しかしリンクのときに、fooを定義したオブジェクトファイルやライブラリが見つからないと、呼び出し命令に入れる番地が決まらず、このエラーになります。定義したファイルをリンクし忘れた、ライブラリを指定し忘れた(-lm など)、名前のつづりや引数の違いで別の名前になっている、といった原因がよくあります。
- A. 文法の誤りならコンパイルの段階で止まります。
- B. 2つあれば多重定義のエラーになります。
- C. 正しい。宣言はあっても定義が見つからない状態です。