TL;DR
分割された複数のソースファイルを、それぞれ独立した機械語の集まり(オブジェクトファイル)に変換し、リンカで 1 つの実行ファイルを作ること。
なぜ必要か
ソースファイルの一部を変更したとき、対応するオブジェクトファイルだけを作り直せばよい。作り直したオブジェクトファイルをほかのオブジェクトファイルとリンクして、実行ファイルを再構築する。
例
Rust では、コンパイルの単位はクレートである。Rust Reference によると、1 回のコンパイルは 1 つのクレートをソースの形で処理し、成功すれば実行ファイルかライブラリのどちらかのバイナリ形式のクレートを 1 つ作る。クレートは、コンパイルとリンクの単位でもある。