C/C++混在環境でリンクに失敗する

C/C++混在環境において 「no definition for “xxx”」などの関数定義が存在しないエラーが発生してリンクに失敗する。

チェックポイント

『 マングル (mangle) 』, 『 名前マングリング (name mangling) 』

解決方法

解決方法は以下の (1) ~ (3) のいずれか。もしくは (1) ~ (3) の組み合わせ。

(1) ヘッダファイルを extern "C" リンケージ指定子で囲む

foo.h

#ifdef __cplusplus でスイッチすることで、C++ソースファイル(*.cpp)からインクルードされたときだけ、名前マングリングが有効となる。(C, C++兼用のヘッダファイルとなる。)

(2) C++ソースファイルの中にインクルード文を記述するときに extern "C" リンケージ指定子で囲む

bar.cpp

リンケージ指定の記述がないヘッダファイル(C言語専用ソースファイル)を、C++ソースファイル(*.cpp)からインクルードする工夫。

(3) C言語関数の宣言に一つ一つリンケージ指定を記述する

baz.cpp

3. 参考リンク