ホームページ >バックエンド開発 >C++ >静的 C ライブラリを C コードにリンクするときに発生する「未定義の参照」エラーを解決するにはどうすればよいですか?

静的 C ライブラリを C コードにリンクするときに発生する「未定義の参照」エラーを解決するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-09 19:33:12348ブラウズ

How to Resolve

静的 C ライブラリと C コードのリンク: 「未定義参照」エラーの解決

C では、カスタム malloc/free ライブラリで new 演算子と delete 演算子をオーバーロードすると、次のような問題が発生する可能性があります。スタティック ライブラリと C コードを組み合わせるときにリンク エラーが発生する可能性があります。正しいリンク順序を確保しているにもかかわらず、名前マングリングが原因で未定義の参照エラーが発生する可能性があります。

名前マングリングについて

C コンパイラは、名前マングリングと呼ばれるメカニズムを使用します。これは、関数名を変更してパラメータやパラメータなどの詳細を含めます。戻り値の型。これにより、異なるシグネチャを持つオーバーロードされた関数がプログラム内で共存できるようになります。

リンク エラーの問題

静的 C ライブラリを C コードとリンクする場合、リンカーはライブラリからの関数名を期待します。 C コンパイラによって生成されたマングルされた名前と一致するようにします。ただし、C コンパイラは名前マングリングを適用しません。

解決策: extern "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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。