当你编写一个 C++ 程序时,下一步是在运行它之前编译它。编译是将人类可读语言(如 C、C++ 等)编写的程序转换为中央处理单元直接理解的机器码的过程。从源文件创建可执行文件涉及许多阶段。这些阶段包括 C++ 中的预处理、编译和链接。这意味着即使程序已编译,也可能因为在链接阶段出现错误而无法运行。因此,大多数 IDE(集成开发环境),如 Eclipse、Geany 等,都将“构建”一词用于将源文件转换为可执行文件的过程。
现在,如何编译某个程序取决于操作系统和编译器。如今,编译器都是通过 IDE(集成开发环境)运行的,其中包含构建和分析工具。你只需单击菜单即可编译程序,然后执行它。但实际上,整个过程分为不同的阶段。这正是 C++ 中编译和链接的作用所在。
预处理
在此阶段,预处理器根据指令(以 # 符号开头)更改程序。C++ 预处理器处理程序并处理 #include 指令,生成的程序是纯 C++ 程序。例如,在 C++ 程序中,#include<iostream> 会指示预处理器读取 iostream 头文件的所有内容,并将这些内容包含到程序中,从而生成一个单独的 C++ 程序文件。C++ 支持许多预处理器指令,如 #include、#define、#if、#else 等。
编译
此阶段将程序转换为低级汇编语言代码。编译器接收预处理过的文件(不带任何指令),并生成包含汇编语言代码的目标文件。现在,创建的目标文件是二进制形式的。在创建的目标文件中,每一行都描述了一个低级机器指令。转换为汇编语言很重要,因为它是许多不同高级语言编译器的通用输出语言。
还有一个汇编阶段,它将这些汇编语言的目标文件转换为机器指令,创建的文件是可重定位的目标代码。因此,编译阶段生成可重定位的目标程序,该程序可以在不同位置使用,无需重新编译。
但是,在将这些目标文件转换为可执行文件之前,你仍然无法运行它们,现在链接器发挥作用了,它将所有目标文件链接起来生成一个单独的可执行文件。
链接
链接顾名思义,是指从多个目标文件创建单个可执行文件的过程。链接后创建的文件已准备好加载到内存中并由系统执行。在理解错误方面,链接与编译有所不同。编译器显示语法错误,例如缺少分号、未定义数据类型等,但如果某个函数被定义了多次,那么这个错误就来自链接器,因为它表明两个或多个源文件具有相同的含义,这会导致错误。
附件:[Selection_101.png] [Selection_103.png]