リビルドしただけなのにUndefined reference エラー
C言語だとよくみかけるUndefined referenceエラー。ようするに、定義のない関数や変数を呼び出していたりすると発生します。だいたいは”Undefined reference hogehoge”となっていて「あー、hogehogeね。hogehoge」ってすぐ解決するんですが、今回はソースコードを変更してないのにこの問題に遭遇しました。
「なんやねん・・・"(-""-)"」
と困惑してましたが、まあ迷ったらひとまずGoogle先生に聞くのが世の常でして、、
ひとまず、検索
「Undefined reference っと つ[検索] 」
瞬殺でした。
どうもgccでビルドした共有ライブラリをg++使ってリンクしたことで起きていたようでした。オブジェクトファイル(この場合はsoファイルかな?)上では同じソースからでもgccとg++で異なる名前になるようで、g++から名前解決できていないということが原因でした。
解決策
extern "C"をつけて関数宣言するとのことです。
#ifdef __cplusplus
extern "C"{
#endif /*__cplusplus */
void hogehoge();
#ifdef __cplusplus
}
#endif /*__cplusplus */
[※4/25更新]
developer-kikikaikaiさんのコメントを受けてgccにも対応するためのプリプロセッサマクロによる処理を追加しました
もうちょっと書くと、
g++で関数を参照する際には関数名そのままではなく、ちょっとした文字列が付加されます(マングル処理と呼ぶらしい)。コンパイラに、Cで書かれてますよって明示的に示してあげることで「マングル処理しないで名前解決してね」ということを伝えているらしい。
なるほど解決。