源文件、目标文件和可执行文件

当编写 C++ 程序时,必须将其输入计算机并保存到文件中。一个类似于文字处理程序的文本编辑器被用于该任务。由程序员编写的语句称为源代码,其保存的文件称为源文件

在将源代码保存到文件之后,就可以开始将其转换为机器语言的过程。在此过程的第一阶段,称为预处理器的程序读取源代码。预处理程序将搜索以#符号开头的特殊行。这些行包含命令或指令,这些命令使预处理器以某种方式修改或处理源代码。

在下一阶段,编译器逐步通过预处理的源代码,将每个源代码指令转换为适当的机器语言指令。此过程将揭示程序中可能出现的任何语法错误。语法错误包括非法使用关键字、运算符、标点符号和其他语言元素等。如果程序没有语法错误,则编译器会将翻译后的机器语言指令,也就是所谓的目标代码,存储在目标文件中。

虽然目标文件包含机器语言指令,但它并不是一个完整的程序。原因如下:C++ 方便地配备了用于执行常规操作或某些困难任务的预先编写完成的代码库。例如,该库包含用于在屏幕上显示消息并从键盘读取输入内容的具体硬件的代码。它还提供数学函数(例如计算数字的平方根)的例程。这个代码的集合称为运行时库,它是广泛性的,所以程序难免要用到它的一部分。然而,当编译器生成目标文件时,它并不包括程序员可能使用到的任何运行时库例程的机器代码。在翻译过程的最后阶段,另一个名为链接器的程序会将目标文件与必需的运行时库例程相结合。一旦链接器完成此步骤,则会创建一个可执行文件。可执行文件包含机器语言指令或可执行代码,并已经可以在计算机上运行。


图 1 将C++源文件转换为可执行文件的过程

图 1 说明了将 C++ 源文件转换为可执行文件的过程。调用预处理器、编译器和链接 器的整个过程可以通过单个操作启动。例如,在 Linux 系统上,以下命令可使名为 hello.cpp 的 C++ 程序被预处理、编译和链接,可执行代码存储在名为 hello 的文件中:

g++ -o hello hello.cpp

许多开发系统,特别是在个人计算机上的这些系统都有集成开发环境(IDE)。这些环境由文本编辑器、编译器、调试器和集成到程序包中的其他实用程序组成,它们具有一组菜单,只需单击一个按钮,或从菜单中选择一个菜单项即可完成预处理、编译、链接、甚至执行程序。