2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[C言語]リビルドしただけなのにUndefined reference エラーが出るぞ?[gcc/g++]

Last updated at Posted at 2019-04-15

リビルドしただけなのに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で書かれてますよって明示的に示してあげることで「マングル処理しないで名前解決してね」ということを伝えているらしい。

なるほど解決。

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?