C ++でのコンパイルとリンクに関する質問が1つ見つかりましたが、どちらが正しいかわかりません。友達と話し合って意見が分かれました。ここに質問があります:
C ++言語で記述されたプログラムを実行するためのソースコードは、
(A)マシンコードにコンパイルされ、
(B)マシンコードにコンパイルされ、リンクされます
。私の意見では、正解はAですが、それを証明するソースがありません。 。
C ++でのコンパイルとリンクに関する質問が1つ見つかりましたが、どちらが正しいかわかりません。友達と話し合って意見が分かれました。ここに質問があります:
C ++言語で記述されたプログラムを実行するためのソースコードは、
(A)マシンコードにコンパイルされ、
(B)マシンコードにコンパイルされ、リンクされます
。私の意見では、正解はAですが、それを証明するソースがありません。 。
スタンドアロンの実行可能ファイルを作成するには、リンケージも必要です。
作成したコードをリンクして、実行可能ファイルにする必要があります。単純なプログラムの場合、コンパイラは、コンパイルプロセスの最後にリンカを呼び出すことにより、これを実行します。
適切なコンパイラーは、Cコードをアセンブラー(クラシックCコンパイラー)に変換し、次にアセンブラーでアセンブルするか、直接マシンコード(多くの最新のコンパイラー)に変換します。マシンコードは通常、「オブジェクトファイル」として生成されますが、printf()を呼び出す場合など、外部ユニットを参照するため、「実行可能」ではありません。完全にスタンドアロンのCコードを作成することは可能ですが、通常は複数のオブジェクトファイルを組み合わせる必要があり、実行可能ファイルを作成するために正しい方法で「フォーマット」する必要があります。これは別のファイルです。オブジェクトファイルよりもフォーマット[通常はかなり似ていますが]。
コンパイルは、C /C++ソースコードをマシンコードに変換することを意味するオブジェクトファイルの作成以外は何もしません。
リンクプロセスは、複数のobjファイルから実行可能ファイルを作成することです。したがって、アプリケーション/実行可能ファイルを実行するには、それもリンクする必要があります。
コンパイル中、コンパイラは、別のオブジェクト(ソースコードファイル)で定義されている可能性があると想定するため、存在しない関数や壊れた関数について文句を言いません。リンカはすべての関数とその存在を確認するため、関数が壊れていると、リンクプロセスでエラーが発生します
コンパイル:入力C/C++-code
を受け取り、マシンコード(オブジェクトファイル)を生成します
オブジェクトファイルにすべての外部参照が含まれているわけではないことに注意してください。
リンク:オブジェクトファイルを外部参照と組み合わせて実行可能ファイルにします
未解決の参照がないことに注意してください!
図:
libc.a
標準ライブラリはどこC
にあり、それはによって自動的にプログラムにリンクされますgcc
。
あなたの質問がc++に関するものであることに気づきましたが、同じ概念がc ++にもあります。これを理解すれば、c++でもどのように機能するかを理解できます。
厳密に言えば。回答A。
しかし、全体像を見るために、いくつかの関数を定義したとしましょう。次に、コンパイラはその関数のマシンコードコードをあるアドレスに書き込み、そのアドレスと関数の名前を、リンカが見つけることができるオブジェクト「.o」ファイルに配置します。次に、リンカはこの「マシンコード」を取得し、以前のエラーで聞いたようにシンボルを解決します。