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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-23 14:53:32210ブラウズ

How to Resolve

静的 C ライブラリを C コードとリンクする際のエラーへの未定義の参照

静的 C ライブラリを C コードとリンクしようとすると、リンク順序を変更したにもかかわらず、「未定義の参照」エラーが発生します。この問題は、「名前マングリング」として知られる、C と C のコンパイルによって作成された異なるシンボル名によって発生します。

C では、リンカーはエラー メッセージにデマングルされたシンボル名を表示するため、混乱を招く可能性があります。 「nm -u」を使用してオブジェクト ファイル (*.o) を検査すると、参照されているシンボル名がライブラリ内のシンボル名と一致しないことがわかります。

この問題を解決するには、関数を外部としてリンクし、 C コンパイラでは、関数宣言を「extern "C" {}」ブロックで囲む必要があります。これにより、ブロック内のすべての C 名のマングリングが抑制されます。

例:

<code class="cpp">extern "C" {
    #include <dual/xalloc.h>
    #include <dual/xmalloc.h>
}</code>

または、次のようにヘッダー ファイルで関数宣言をラップすることもできます。

<code class="cpp">#if defined (__cplusplus)
extern "C" {
#endif

/*
 * Put plain C function declarations here ...
 */

#if defined (__cplusplus)
}
#endif</code>

以上が静的 C ライブラリを C コードとリンクするときに発生する「未定義の参照」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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