なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

C/C++でundefined reference toエラーが出る場合

フリーソフトを落としてきて「./configure → make」しようとすると
undefined reference to〜」が出てきて砂を噛むような思いをした人は多いはず。

パターン1 '~'の部分にメソッド名とかが見える

undefined reference to `HogehogeClass::HogehogeMethod()'
…(山のようなエラー)…

  • 原因:そのメソッド等が定められているライブラリをリンクしていない
  • 対策:つまりはそのライブラリを読み込めばいいので「make LDFLAGS='-lhogehogelibrary'」みたいな感じで参照するライブラリを追加してやるといい。

ポイント

  • Makefileの中身を見て、LDFLAGSが定義されているか確認
  • 追加しなければならないhogehogelibraryの場所も追加してやる

例えば /usr/local/lib 以下にある libiconv.a をLDFLAGSに追加する場合
LDFLAGS='-L/usr/local/lib -liconv'
が正しいリンクのやり方となる

パターン2 〜の部分にメソッド名が見えて、なおかつ「vtable for」の文言がある

undefined reference to `vtable for HogehogeClass::~HogehogeMethod()'

  • 原因:HogehogeClassで規定されている仮想関数が、上のクラスで実装されてない
  • 対策:文句を言われている「~HogehogeMethod()」の部分がどこかで「virtual」で宣言されているはずなので、ちゃんと使ってやる。
傾向
  • 1はフリーウェアになんのライブラリが使われているか把握していない時とか、実はバージョンが合ってない場合に起こる。GTK+とかはバージョンが違うと、ライブラリの名前があっているのにundefined referenceエラーが出てきて非常に糞です。
  • そんでもってコマンドラインコンパイルやってる時にインクルードとライブラリの順番が違ってるとかいう初歩的ミスで起こることもある。
  • 2は自作プログラムで仮想関数使い忘れているときに起こる。フリーウェアでこれが起きてたらちょっと終わってる。


C++だとこのへんがおすすめ

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

C++クラスと継承完全制覇 (標準プログラマーズライブラリ)

C++クラスと継承完全制覇 (標準プログラマーズライブラリ)