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).