这些乱七八糟的文件是什么?
编译一个项目之后,你会发现在项目目录里多了很多文件,这些文件是什么?有什么作用?
1、源文件(Source File)
我们之前写了几段代码了,创建了几次以.c
为后缀的文件,将你写的代码保存起来的文件就叫源文件。
每种编程语言的源文件都有特定的后缀,以便于编译器对源文件的识别。一般来说,后缀名都是以编程语言名称来命名的。例如Java源文件的后缀是.java
,Python的源文件后缀是.py
。
源文件只是一个文本文件,内部没有特殊格式。所以,就算你创建一个.txt
的文本文件,把代码保存进去,再将.txt
改为.c
,对编译器依旧有效的。总而言之,后缀仅仅是为了让编译器识别它,让程序员更容易理解。
2、项目(project)
一个完整的项目往往包含很多功能,实现这些功能不仅需要成千上万行代码,还有可能包含图片,音视频等资源文件。我们不能将所有代码都写在一个源文件里,这样不仅打开缓慢,开发和维护也会极为困难。也不能将种类繁多的资源文件放在一起。
我们总是建议将不同功能的代码写在不同的源文件中,将不同的资源文件分类管理。为了有效地管理这些种类繁杂、数目众多的文件,我们有理由把它们都放到一个目录(文件夹)下,并且这个目录下只存放与当前程序有关的资源。实际上 IDE 也是这么做的,它会为每一个程序都创建一个专门的目录,将用到的所有文件都集中到这个目录下,并对它们进行便捷的管理,比如重命名、删除文件、编辑文件等。
这个为当前程序配备的专用文件夹,在 IDE 中也有一个专门的称呼,叫“Project”,翻译过来就是“工程”或者“项目”。
3、工程类型/项目类型
“程序”是一个比较宽泛的称呼,它可以细分为很多种类,例如:
- 有的程序不带界面,完全是“黑屏”的,只能输入一些字符或者命令,称为控制台程序(Console Application),例如 Windows 下的 cmd.exe,Linux 或 Mac OS 下的终端(Terminal)。
- 有的程序带界面,能够使用鼠标点击,称为GUI程序(Graphical User Interface Program),例如 QQ、迅雷、Chrome 等。
- 有的程序不单独出现,而是作为其它程序的一个组成部分,普通用户很难接触到它们,例如静态库、动态库等。
不同的程序对应不同的工程类型(项目类型),使用 IDE 时必须选择正确的工程类型才能创建出我们想要的程序。换句话说,IDE 包含了多种工程类型,不同的工程类型会创建出不同的程序。
4、编译器是如何编译的?
当你启动编译器,就开始以下步骤:
-
将源文件转换成中间文件。如果有多个源文件,则会生成多个中间文件,中间文件的后缀是
.obj
。C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,如果只更改某个模块,不必因此重新编译其它模块。中间文件已经非常接近可执行文件了,它们都是二进制格式,内部结构也非常相似,但仍不是可执行文件。 -
链接器将这些中间文件组合起来,另外,链接器还将你编写的程序与预编译的库代码合并,例如上述程序中我们经常用到的
printf()
函数。中间代码文件中并不包含该函数的代码,它只是包含了使用该函数的指令。而该函数的代码储存在另一个被称为库的文件中。此外,中间代码文件还缺失启动代码。启动代码充当着程序和操作系统之间的接口。所以,连接器的作用就是,把你编写的目标代码,系统的标准启动代码和库代码这3部分合并成一个文件,即可执行文件。可执行文件的后缀是.exe
。可执行文件的执行不依赖于目录中的其它文件,你将它单独拿出来,也是可以执行的。
注意:这就是为什么,你的写了一个最简单的程序之后,文件夹里会多出一些文件。需要注意的是,不同的开发工具对这些文件的管理方式不同,例如你用Visual Studio创建一个项目后,会多出一个.sln
文件,这个是解决方案,解决方案比项目又高一层,也就是说,一个解决方案包含多个项目。(解决方案文件通常很小,这是因为它里面并不包含所有项目的文件,而是只包含索引,这样你打开一个解决方案,就能发现同时打开的还有该目录下的一个或者多个项目。)
网友评论