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

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

1. チェックポイント

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

2. 解決方法

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

foo.h

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

2.2. C++ソースのインクルード文を extern "C" リンケージ指定子で囲む

bar.cpp

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

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

baz.cpp

3. 参考リンク