コンパイルの全プロセス:プリコンパイル、コンパイル、アセンブリ、リンク

1172 ワード

コンパイルは4つのステップに分けられます.各ステップはファイルを次のように別のフォーマットにコンパイルします.
ステップ
未コンパイル
プリコンパイル
コンパイル
アセンブル
リンク
ファイル
fun.h、fun.cpp、test.cpp
fun.i、test.i
fun.s、test.s
fun.o、test.o
projectname.exe : 1.プリコンパイル:
プリコンパイルプロセスは主に4つのことをします:1ヘッダファイルを展開して#include あるいは#include "filename"と書かれたファイルの中で、ファイルfilenameを展開して、通俗的にはfienameファイルの中のコードを現在のファイルに書きます;②マクロ置換③注釈を除く④条件コンパイルは#ifndef #define #endifに対して判断チェックを行うということであり、このステップでは#ifndef #define #endifの役割が現れ、つまりヘッダファイルが複数回繰り返し引用されることを防止する
2.コンパイル
コードをアセンブリコードに変換し、このステップで2つの重要な作業を行いました.1コンパイラは、現在のファイルに含まれる各関数のアドレスを格納する関数アドレステーブルをファイルごとに保存します.②このステップではアセンブリコード、すなわち1つ1つの命令を生成するため、呼び出し関数のコードは1つのcall命令にコンパイルされ、call命令の後ろにはjmp命令のアセンブリコードアドレスが付いており、jmp命令の後ろには「呼び出された関数がアセンブリコードにコンパイルされた最初の命令」のアドレスが付いている.しかしcallコマンドの後ろにアドレスを補充する仕事はリンクするときにすることです.
3.アセンブリ
アセンブリコードをマシンコードに変換
4.リンク
コンパイラは複数生産される.oファイルをリンクして実行可能な1つを生成する.exeファイル;しかし、この過程で、コンパイラがした重要なことは、各ファイルのcallコマンドの後ろのアドレスを補充することです.方法は、現在のファイルの関数アドレステーブルから探し始め、ない場合は、別のファイルの関数アドレステーブルに探し続け、見つけたらcallコマンドの後ろに埋め、見つからない場合はリンクに失敗します.