これは、C++ の名前マングリングが原因です
nm -C
名前のマングリングを防ぐために、
- C コンパイラ (g++ ではなく gcc) を使用し、ソース ファイルに .c (.cpp ではなく) という名前を付けます
- または extern "C" を宣言:
.
my.h
extern "C"
{
void start();
void finish();
}
これにより、「C」リンケージが提供されます。つまり、オーバーロードできず、参照渡しもできず、c++ もありません:)
C++ の名前マングリングのように聞こえます。
他の回答が述べているように、これはおそらく C++ の名前マングリングが原因です。 「マングルされていない」名前でシンボルにアクセスできるようにし、それが C++ で実装されている場合は、extern "C"
を使用する必要があります。 C リンケージがあることを C++ コンパイラに伝えます。
関数プロトタイプを含むヘッダーには、次のようなものが必要です:
#if defined(__cplusplus)
extern "C" {
#endif
// the prototype for start()...
#if defined(__cplusplus)
}
#endif
これにより、関数が C++ コンパイラによって使用される場合、extern "C"
が取得されます。 宣言で、それが C モジュールで使用されている場合、extern "C"
によって混乱されることはありません。 指定子。
関数定義の前にヘッダーを含める場合、.cpp ファイルに実装する必要はありません。前の宣言から見たリンケージ仕様を使用します。ただし、関数定義を extern "C"
で装飾することを好みます すべてが同期していることを確認するためだけに (.cpp ファイルでは #ifdef
は必要ないことに注意してください) 前処理のもの - 常に C++ としてコンパイルされます。