C++でCのライブラリを組み込もうとして「undefined reference to ○○」にハマった

   2020/02/01

ESP-IDFベースのとあるC++プロジェクトで、Cのライブラリを組み込もうとした時、このエラーが起こった。

SSD1306_Update()が宣言されているヘッダ(ssd1306.h)のインクルードを忘れていないかとかタイポしてないかとか、色々試したけど動かず。
他の正常に動いているメソッドとかと散々比較して、最終的に「extern "C"」というのをつけ忘れていたことがわかった。

これで動いた。

調べたら、これと全く同じ問題が解説されていた。

つまり、「extern "C"」がなかった時は、変な名前のシンボル名でSSD1306_Update()が紐づけられ、それを使って他のファイルのコンパイルも進んで行ったけど、変な名前のシンボル名になったために関数の定義と結びつくことができなかったと。
でも「extern "C"」を使ったことでシンボル名と関数名が一致し、やっと関数の定義と結びつくことができたと。

なるほどなぁ〜。
どおりでエラーの出力がおかしかったわけだ。

他の正しく動いてたCファイルの関数を意図的にエラーを起こさせてみると「undefined reference to ○○」の○○の部分は関数名のみなのに、SSD1306_Update()に関しては引数まで出てきちゃってたからなんかおかしいと思ったんだ。

○○の部分っていうのは関数名ではなくシンボル名。
SSD1306_Update()はC++側の名前マングリングで引数もろともシンボル名にされてしまったから、undefinedの時は引数まで出てきていたというわけだ。
他の正しく動いてたやつはちゃんとCの関数として関数名のみでシンボル名が構成されていたから関数名のみ出てたわけだ。

一応ヒントは出ていたんだなぁ〜。
気づかなかったけど。

タイトルとURLをコピーしました

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

fourteen − 8 =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください