C/C++混在環境において 「no definition for “xxx”」などの関数定義が存在しないエラーが発生してリンクに失敗する。
チェックポイント
『 マングル (mangle) 』, 『 名前マングリング (name mangling) 』
解決方法
解決方法は以下の (1) ~ (3) のいずれか。もしくは (1) ~ (3) の組み合わせ。
(1) ヘッダファイルを extern "C" リンケージ指定子で囲む
foo.h
1 2 3 4 5 6 7 8 9 |
#ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* 中略 (関数宣言) */ #ifdef __cplusplus } #endif /* __cplusplus */ |
#ifdef __cplusplus でスイッチすることで、C++ソースファイル(*.cpp)からインクルードされたときだけ、名前マングリングが有効となる。(C, C++兼用のヘッダファイルとなる。)
(2) C++ソースファイルの中にインクルード文を記述するときに extern "C" リンケージ指定子で囲む
bar.cpp
1 2 3 4 |
extern "C" { #include "spam.h" #include "ham.h" } |
リンケージ指定の記述がないヘッダファイル(C言語専用ソースファイル)を、C++ソースファイル(*.cpp)からインクルードする工夫。
(3) C言語関数の宣言に一つ一つリンケージ指定を記述する
baz.cpp
1 2 3 4 5 6 7 8 |
extern "C" int hello(const char* name); extern "C" int bye(void); int Greeting::Say(void) { /* 中略 */ result = hello("Taro"); /* 中略 */ } |