There is no rigorous definition; these terms are used by convention within the compiler & toolchain builder community. Within that community, there is interest in creating tools that target and run on various combinations of hosts and host types. Most developers are accustomed to using compilers that are native to the target architecture: we build applications on the target architecture itself. However, it is also possible to build application binaries which are intended to run on other architectures. This we call cross-compiling, or more accurately, cross-building.
The matter is even deeper, however. Consider that someone has to build the cross-compiler that generates the binaries. Here, the jargonology becomes significant. For instance, one may wish to create a cross compiler that runs on a x86 host, but creates binaries for a PowerPC target. In this case, the 'host' is the X86 host, and the 'target' is the PowerPC. When the cross-compiler that runs on the x86 host was built, it was done on a 'build' host, which was potentially a third, completely different architecture than the 'host' or 'target' architectures.
For a view of the issues related to this subject, you could review the
archives of the crosstool-ng mailing list.
--- rod.