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)
- 作者: スコットメイヤーズ,小林健一郎
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
C++クラスと継承完全制覇 (標準プログラマーズライブラリ)
- 作者: 矢沢久雄
- 出版社/メーカー: 技術評論社
- 発売日: 2002/09
- メディア: 単行本
- 購入: 3人 クリック: 92回
- この商品を含むブログ (32件) を見る