梅冠华-2019-04-26
翻译自C++学习网站 learncpp(www.learncpp.com) 第0章 第5节
https://www.learncpp.com/cpp-tutorial/introduction-to-the-compiler-linker-and-libraries/
0.5 编译器、链接器和库简介
让咱们继续来讨论上节课的流程图中的第4到第7步
第4步: 编译你的源代码
为了编译C++程序,咱们要使用C++的编译器。C++编译器顺序地查阅你程序中的每个源代码(.cpp)文件并且做两个重要工作:
第一,它检查你的代码以确保其遵守了C++语言的规则。如果其没遵守,那么编译器将给你抛出一个错误(error)(以及对应的行号)以便准确定位出什么需要修正,编译过程将同时终止直到该错误被纠正无误。
第二,它将C++源码翻译成机器语言,并命名为目标(object)文件。目标文件通常命名成name.o或name.obj,其中name是和该目标文件的来源.cpp文件一样的名字。
比如,如果你的程序有3个.cpp文件,那么编译器将会生成3个目标文件:
许多不同的操作系统都可获得C++编译器,咱们后面将会讲讲如何安装一个编译器,所以这里就不需要这么做了。
第5步:链接目标文件和库
在编译器创建一个或多个目标文件后,另一个称之为链接器的程序就来了。链接器所做的工作有三个:
首先:把编译器生成的所有目标文件联合成一个单独的可执行程序。
其次,除了能链接目标文件,链接器还能链接库文件。库文件是预先编译好的代码的集合,其已经“打包”好了,可以很方便地用在其它程序中。
实质上C++核心语言非常小和精简(你将会在该教程中学到它)。然而,C++同时自带了一个扩展库,名为C++标准库(C++ Standard Library,通常简写为标准库),其提供了很多附加功能给用户在其程序中使用。C++标准库当中大家最常用的一个库便是iostream库(input output stream输入输出流)了,其包含了往屏幕上输出文字和从键盘获取用户输入的功能。几乎每个C++程序都会用到标准库,所以在你的程序中将标准库链接进来是非常普遍的。许多的链接器会自动地链接到标准库上,只要你使用了其某一部分,所以这个你通常无需担心。
你也可以有选择地链接其他库。例如,如果你要写一个播放声音的程序,你或许不希望自己写代码来从磁盘中读取声音文件,检查文件以保证其是否正确,或是琢磨如何把声音数据折腾到操作系统或是硬件上来通过喇叭播放它们——这将会是大量繁重的工作!相反,你可能会下载某个已经知道如何做这些事情的库,并让它来做这些事情。咱们将会在附录谈到如何连接库(并创建自己的库!)。
再次,链接器确保所有交叉文件依赖性都得到了妥善解决。例如,若你在一个.cpp文件中定义了某些事,然而在另一个.cpp文件中使用它,那么链接器将会把他俩连接起来。如果链接器无法把某些事根据其定义连接到相应的参考上去,你将会得到一个链接错误(linker error),并且链接器将终止。
一旦链接器完成了所有目标文件和库的链接(假设一切顺利),你将会得到一个可以拿来运行的可执行文件了!
针对高阶读者
对于复杂的工程,一些开发环境使用makefile,其是一个文件,描述如何建立(build)程序(如,哪些文件去编译和链接,或者用不同的方式来处理的流程)。要说清楚如何书写和维护makefiles需要整本书的章节,但是makefile确实是无比强大的工具。然而,因为makefiles不属于C++核心语言,而且你并不是非用它们不可,所以咱们就不在该教程中讨论它们了。
第6&7步:测试和纠错
这是非常有趣的部分(但愿如此)!你能跑下你的可执行程序,并且看看是否它生成了你所期待的结果。
如果你的程序运行了,但是并没有正确工作,那么就到了纠错时间了,你得琢磨出是什么错误来。很快,咱们将会深入地探讨如何测试你的程序并且如何对它们开展纠错。
集成开发环境/Integrated development enviroments (IDEs)
注意步骤3、4、5和7都与软件相关(编辑、编译、链接、纠错)。当然你可以使用分开的程序来单独做这些事情,也可以使用一个叫做集成开发环境(IDE)的软件包来一起做这些事情。我们将在下一节探讨IDEs,并且安装一个IDE。
梅冠华-2019-04-26
翻译自C++学习网站 learncpp(www.learncpp.com) 第0章 第5节
https://www.learncpp.com/cpp-tutorial/introduction-to-the-compiler-linker-and-libraries/