【C++】リンクおよびundefined referenceの秘密


1、リンクCまたはC++が関数および変数を外部参照する場合、参照の状況に応じてリンクは異なる処理方法を選択します.この関数または変数の定義がまだ発生していない場合、リンクはその識別子を未解析の参照リスト、すなわちundefined referenceに追加します.リンクがこの関数または変数の定義に遭遇した場合、これが解決された参照です.
リンクがターゲットモジュールで関数または変数の定義を見つけられない場合は、ライブラリを検索します.ライブラリには、すべてのターゲットモジュールをライブラリに検索する必要がなく、インデックスを参照するだけのインデックスがあります.リンクがライブラリに定義されている場合は、関数定義だけでなくターゲットモジュール全体を実行可能プログラムにリンクします.必要な定義を含むターゲットモジュールだけがリンクに参加し、ライブラリ全体がリンクに参加するのではなく、リンクに参加することに注意してください.そうしないと、プログラムは意味のない膨大になります.プログラムの長さをできるだけ小さくしたい場合は、自分のライブラリを構築するときに、ソースファイルに関数を1つだけ置くことを考慮します.
リンクは指定した順序でファイルを検索し、ユーザーがライブラリ関数と同じ名前の関数を使用して、この関数を持つファイルをライブラリファイル名リストに挿入する前に、ライブラリ関数の代わりに独自の関数を使用することができます.リンクは、ライブラリファイルを見つける前に、ユーザが指定した関数で参照を説明するために使用されるため、ユーザの関数額はライブラリ関数ではありません.注意、時にはそうする必要があるかもしれませんが、これはバグであり、C++の名前空間では禁止されています.
最後に、リンクはターゲットモジュールまたはライブラリで必要な定義が見つからない場合に、エラーundefined referenceを放出します.後で、エラーundefined referenceの原因となるいくつかの一般的な状況について説明します.C/C++実行可能プログラムを作成すると、リンクはデフォルトで一部のモジュールにリンクされます.そのうちの1つは、プログラムの初期化ルーチンを含む起動モジュールです.初期化ルーチンは、C/C++プログラムの実行を開始するときに最初に実行しなければならないプログラムであり、スタックを確立し、プログラム内のいくつかの変数を初期化する.リンクは常に標準ライブラリからプログラムで呼び出されたコンパイルされた標準関数を検索します.標準ライブラリは常に見つかるので、プログラムに必要なヘッダファイルが含まれている限り、ライブラリ内のモジュールを使用して、リンクに標準ライブラリを探すように伝える必要はありません.追加のライブラリを使用する場合は、リンクで処理されるリストファイルにライブラリファイル名を追加する必要があります.
2、undefined reference C/C++プログラム開発ではundefined referenceはよく発生するエラーであり,このエラーを引き起こすいくつかの一般的な状況をまとめた.
(1)確かに定義されていない関数を使用し、現在のモジュールと外部ライブラリに定義されていません.(2)外部ライブラリの関数を使用したが,外部ライブラリはリンクされていない.(3)外部ライブラリの関数を使用して外部ライブラリをリンクしているが,リンク順序が間違っており,上のリンクの紹介からリンク解析参照のルールがわかり,正しい方法は関数定義を含む外部ライブラリ名をこの関数定義を使用したモジュール名の後ろに置くことである.(4)もう1つの隠れたエラーがあり、CC++の同名関数のコンパイル結果は異なり、コンパイル結果ではC++の関数はリロードをサポートしてパラメータタイプ情報を持ち、Cの関数はパラメータタイプ情報がなく、C++Cコードの関数を呼び出すのは当然問題ないが、CC++コードの関数を呼び出すと問題があり、必要な関数定義が見つかりません.よくある方法は、この関数の定義と宣言にextern "C"を使用し、C関数であることを示し、C関数でコンパイルされ、他にも多くのテクニックがあり、実戦で模索してまとめることができます.