让我们继续上一节的讨论。
编译过程详解
步骤4:编译源代码
为了编译C++源代码文件,我们使用C++编译器。C++编译器会依次处理程序中的每个源代码(.cpp)文件,并执行两个重要任务:
语法检查与错误报告:首先,编译器检查你的C++代码,确保它遵循C++语言的规则。如果不符合,编译器会给出错误(以及相应的行号)来帮助你定位需要修复的地方。编译过程也会在错误修复之前中止。
代码转换为机器语言:其次,编译器将你的C++代码翻译成机器语言指令。这些指令存储在一个中间文件中,称为目标文件。目标文件还包含后续步骤所需的其他数据(包括链接器在步骤5中需要的数据,以及调试步骤7中的数据)。
目标文件的命名与组织
目标文件通常被命名为name.o或name.obj,其中name与生成它的.cpp文件同名。 例如,如果你的程序有3个.cpp文件,编译器将生成3个目标文件:
- main.cpp → main.o (或 main.obj)
- physics.cpp → physics.o (或 physics.obj)
- render.cpp → render.o (或 render.obj)
C++编译器适用于许多不同的操作系统。我们很快将讨论如何安装编译器,所以现在不需要这么做。
链接过程与输出文件生成
步骤5:链接目标文件和库并创建所需的输出文件
编译器成功完成后,另一个名为链接器的程序开始工作。链接器的工作是将所有目标文件合并并生成所需的输出文件(例如你可以运行的可执行文件)。这个过程称为链接。如果链接过程中的任何步骤失败,链接器将生成一个描述问题的错误消息,然后中止。
链接器的工作流程包括:
读取并验证目标文件:首先,链接器读取编译器生成的每个目标文件并确保它们有效。
解决跨文件依赖关系:其次,链接器确保所有跨文件依赖关系得到正确解决。例如,如果你在一个.cpp文件中定义了某个东西,然后在另一个.cpp文件中使用它,链接器将两者连接起来。如果链接器无法将引用连接到其定义,你将得到一个链接器错误,链接过程将中止。
链接库文件:第三,链接器通常会链接一个或多个库文件,这些库文件是已经"打包"好的预编译代码集合,用于在其他程序中重用。
生成最终输出文件:最后,链接器输出所需的输出文件。这通常是可以启动的可执行文件(但如果你的项目是这样设置的,也可能是库文件)。
库文件的类型与使用
标准库
C++附带了一个广泛的库,称为C++标准库(通常称为"标准库"),为你的程序提供了一系列有用的功能。C++标准库中最常用的部分之一是输入/输出库(通常称为"iostream"),它包含在监视器上打印文本和从用户获取键盘输入的功能。
几乎所有编写的C++程序都以某种方式使用标准库,因此将C++标准库链接到你的程序中是非常常见的。大多数C++链接器默认配置为链接标准库,所以你通常不需要担心这个问题。
第三方库
你可以选择链接第三方库,这些库是由独立实体创建和分发的库(而不是作为C++标准的一部分)。例如,假设你想编写一个播放声音的程序。C++标准库不包含这样的功能。虽然你可以自己编写代码来从磁盘读取声音文件,检查它们是否有效,或者弄清楚如何将声音数据路由到操作系统或硬件以通过扬声器播放——这将是很多工作!相反,你更有可能找到一些现有的软件项目,它们有一个库已经为你实现了所有这些功能。
我们将在附录中讨论如何链接库(以及创建你自己的库!)。
构建、测试与调试
构建过程概述
因为有多个步骤涉及,所以"构建"这个术语通常用来指代将源代码文件转换为可运行的可执行文件的整个过程。作为构建结果产生的特定可执行文件有时被称为构建。
高级构建自动化工具
对于复杂项目,构建自动化工具(如make或build2)通常被用来帮助自动化构建程序和运行自动化测试的过程。虽然这些工具强大且灵活,但它们不是C++核心语言的一部分,你也不需要使用它们来继续,因此我们不会在本教程系列中讨论它们。
步骤6 & 7:测试和调试
这是有趣的部分!你现在可以运行你的可执行文件并看看它做了什么!
一旦你可以运行你的程序,那么你就可以测试它。测试是评估你的软件是否按预期工作的过程。基本测试通常涉及尝试不同的输入组合,以确保软件在不同情况下正确行为。
如果程序的行为不符合预期,那么你需要进行一些调试,这是寻找和修复编程错误的过程。
我们将在未来的章节中更详细地讨论如何测试和调试你的程序。
集成开发环境(IDE)
请注意,步骤3、4、5和7都涉及必须安装的软件程序(编辑器、编译器、链接器、调试器)。虽然你可以为这些活动使用单独的程序,但一个名为集成开发环境(IDE)的软件包将所有这些功能捆绑并集成在一起。我们将在下一节讨论IDE,并安装一个。