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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-23 01:13:15820ブラウズ

Why Do I Get

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

C プログラムを静的 C ライブラリにリンクするとき、「未定義の参照リンクコマンドでライブラリ名を指定している場合でも、" エラーが発生する場合があります。この問題は、C と C のコンパイル プロセスの違いが原因で発生します。

C では、コンパイラは名前マングリングを実行し、オブジェクト ファイル内の関数シンボルをマングルされた名前に変換します。ただし、C ライブラリ関数は名前のマングリングを受けません。したがって、リンカは、オブジェクト ファイル内のマングル化された関数名とライブラリ内のマングル化されていない関数名を一致させることが困難になり、未定義の参照エラーが発生します。

解決策

この問題を解決するには、C ライブラリをリンクする C プログラムは extern "C" ブロックを使用する必要があります。このブロックは、そのブロック内のすべての宣言と定義の名前マングリングを抑制します。ライブラリ関数宣言を extern "C" ブロックで囲むことにより、リンカはライブラリ関数宣言を識別し、未定義の参照エラーを解決できます。

あるいは、ライブラリ関数宣言を含むヘッダー ファイルを条件宣言でラップして、ライブラリ関数宣言を区別することもできます。 C および C コンパイル環境。 C コンパイルの場合、宣言は extern "C" {} ブロックで囲む必要があります。これにより、ライブラリ関数の名前マングリングが確実に抑制され、未定義の参照エラーなしでリンクを成功させることができます。

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

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