C では、カスタム malloc/free ライブラリで new 演算子と delete 演算子をオーバーロードすると、次のような問題が発生する可能性があります。スタティック ライブラリと C コードを組み合わせるときにリンク エラーが発生する可能性があります。正しいリンク順序を確保しているにもかかわらず、名前マングリングが原因で未定義の参照エラーが発生する可能性があります。
C コンパイラは、名前マングリングと呼ばれるメカニズムを使用します。これは、関数名を変更してパラメータやパラメータなどの詳細を含めます。戻り値の型。これにより、異なるシグネチャを持つオーバーロードされた関数がプログラム内で共存できるようになります。
静的 C ライブラリを C コードとリンクする場合、リンカーはライブラリからの関数名を期待します。 C コンパイラによって生成されたマングルされた名前と一致するようにします。ただし、C コンパイラは名前マングリングを適用しません。
この問題を解決するには、C ライブラリを参照する関数宣言を extern "C で囲みます。 " ブロック。これにより、ブロック内の宣言の名前マングリングが抑制され、リンカーが関数を正しく識別できるようになります。
extern "C" { #include "libxmalloc.h" }
さらに、ヘッダー ファイル内の関数宣言は次のようにラップできます。
#if defined (__cplusplus) extern "C" { #endif /* * Plain C function declarations here ... */ #if defined (__cplusplus) } #endif
名前のマングリングを抑制することで、リンカーは静的ライブラリ内の正しいシンボル定義を見つけて、未定義の参照エラーを解決できます。
以上が静的 C ライブラリを C コードにリンクするときに発生する「未定義の参照」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。