Compiling a program takes place by running the compiler on the build platform. The compiled program will run on the target platform. Usually these two are the same; if they are different, the process is called cross-compilation.

Typically the hardware architecture differs, like for example when compiling a program destined for the MIPS architecture on a X86 computer; but cross-compilation is also applicable when only the operating system environment differs, as when compiling a Hurd program under Linux.

Cross-compilation is somewhat more involved and errors are easier to make than with normal compilation. Due to this it is normally only employed if the target is not yet self-hosting (able to compile programs on its own), unstable, or the build system is simply much faster. For many embedded systems cross-compilation is the only possible way (some may be not powerful enough to run a compiler).