ホームページ >バックエンド開発 >C++ >静的 C ライブラリを C コードにリンクすると「未定義の参照への参照」エラーが発生するのはなぜですか?

静的 C ライブラリを C コードにリンクすると「未定義の参照への参照」エラーが発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-07 09:54:13580ブラウズ

Why Do I Get

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

静的 C ライブラリを C コードにリンクしようとすると、一般的に " 「未定義の参照」エラー。これらのエラーは、オブジェクト ファイルの順序やリンク フラグを調整した後でも発生します。ただし、同じライブラリを使用する他の C プログラムではこれらのエラーは発生しないため、この問題は C リンクに限定されます。

根本原因: 名前のマングリング

C と C コンパイルの主な違い名前のマングリングです。 C プログラマーは宣言どおりの関数名を自由に使用できますが、C では複数のソース ファイルをコンパイルするときに名前の競合を防ぐために関数、クラス、テンプレートの名前をマングルします。

静的 C ライブラリを C コードとリンクする場合、リンカーは参照として壊れたシンボル名を期待します。ただし、C ライブラリはマングルされていないシンボルを提供しており、「未定義の参照への参照」エラーが発生します。

解決策: 名前マングルの抑制

これらのエラーを解決するには、extern "C" ブロックを次のようにします。特定のスコープでの C 名のマングリングを抑制するために使用され、C ライブラリと対話する関数宣言を囲みます。そうすることで、リンカーはマングルされていない参照を認識し、ライブラリを正常にリンクします。

もう 1 つの効果的なアプローチは、コンパイルが C かどうかに基づいて条件付きでコンパイルするプリプロセッサ ディレクティブを使用してヘッダー ファイルに関数宣言をラップすることです。 C.このアプローチにより、コンパイル コンテキストに応じて正しい関数名が使用されるようになります。

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

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