クロスコンパイラ

クロスコンパイラ（）は、コンパイラが動作している以外のプラットフォーム向けに実行ファイルを生成する機能を持つコンパイラである。クロスコンパイラは主に組み込みシステム向けのコンパイラや、マルチプラットフォーム対応のコンパイラとして使われる。
必要最小限のメモリしか搭載していないことが多いマイクロコントローラを使った組み込みシステムなど、実行ファイルを動作させたいプラットフォームがコンパイル環境としては不適切な場合にはクロスコンパイラは必須である。
システムが複数のプラットフォームをサポートする場合に、準仮想化のためのツールとしてクロスコンパイラを利用することが一般化しつつある。
使用法.
クロスコンパイラの基本的使用法は、ビルド環境をターゲット環境から分離することである。これは以下のような場合に便利である。
JavaのJVMのような仮想機械を使うことで、クロスコンパイラを開発する動機となっている問題の一部は解決される。仮想機械は、1つのコンパイラの出力を複数の異なるシステムで利用可能にする。
典型的にはアーキテクチャが異なればクロスコンパイラを利用することになる（例えば、MIPSアーキテクチャ向けのプログラムをx86上でコンパイルするなど）。しかしそれだけでなく、OS環境が違うだけであってもクロスコンパイラが使われ、例えばLinux上でFreeBSD用の実行ファイルを作るといった利用が考えられる。さらには、システムライブラリが違う環境向けのクロスコンパイルもある（glibcホスト上でuClibcを使ったコンパイルをするなど）。
GCCとクロスコンパイル.
GCCは、コンパイラ群を集約したフリーソフトウェアであり、クロスコンパイル向けの設定も可能である。GCCは様々なプラットフォームや言語をサポートしている。しかし、手が足りないためにクロスコンパイラの保守がなされていない場合があり、多くのリリースでクロスコンパイラが機能していない。
GCCには、ターゲットプラットフォーム毎にbinutilsのコンパイルされたコピーが必要である。その中でも GNUアセンブラ が重要である。従って、binutils をまず codice_1 スイッチ付きでコンパイルしなければならない。GCC も同じ codice_2 オプション付きで設定しなければならない。GCCはパスで指定されたbinutilsを使って普通に動作する。パスは（シェルとしてBashを使う場合には）以下のように指定する。
 PATH=/path/to/binutils/bin:$PATH; make
クロスコンパイルを行うGCCでは、ターゲットプラットフォームの標準Cライブラリがホストプラットフォームで利用可能になっている必要がある。少なくとも、crt0というライブラリの一部は必須である。標準Cライブラリ全体をコンパイルした場合、プラットフォームによっては大きすぎることもある。代替として、標準CライブラリのうちC言語のソースコードのコンパイルに必須な部分だけを抽出したnewlibを使う方法もある。GCCでnewlibを使うには codice_3 スイッチを使う。
GNU autotoolsパッケージでは、ビルドプラットフォーム (build platform)、ホストプラットフォーム (host platform)、ターゲットプラットフォーム (target platform) という用語を使う。ビルドプラットフォームとは、コードが実際にコンパイルされる場所を指す。ホストプラットフォームとは、コンパイルされたコードが実行される場所を指す。ターゲットプラットフォームとは、コンパイラにのみ適用され、パッケージ自身が生成するオブジェクトコードのタイプを表す（例えば、クロスコンパイラをクロスコンパイルする場合など）。それ以外の場合はターゲットプラットフォームの設定は不適切である。例えば、ドリームキャストで動作するビデオゲームのクロスコンパイルを考えると、コンパイルを行うマシンがビルドプラットフォームで、ドリームキャストがホストプラットフォームとなる。
カナディアンクロス.
カナディアンクロス (Canadian Cross) とは、他のマシンで動作するクロスコンパイラを作成する技法である。三種類のマシンA、B、C があるとき、Bで動作してC向けの実行ファイルを生成するクロスコンパイラをA上で作ることをいう。GCCのコンフィグではAをbuild、Bをhost、Cをtargetと言う。buildについては明示的に指定しなくても普通はスクリプトで情報を収集できるが、hostとtargetは当然ながら指定しなければならない。
GCCでカナディアンクロスを行う場合、4つのコンパイラが関わってくる。
最後のクロスコンパイラはビルドを行っているマシンA上では動作できないが、マシンB上でそれを使えば、マシンC上で動作する実行ファイルを生成できる。
例えば、NetBSDにはPOSIXシェルスクリプト codice_4 があり、これを使ってホストコンパイラで自前のツールチェーンを構築でき、さらにそこからクロスコンパイラを構築していくことができる。
このようなクロスコンパイラはそれ以前からもあったが、「カナディアンクロス」という呼称はGCCの開発において命名されたもので、当時のカナダに3つの大きな政党があったことに由来する。