Windows零基础入门:2.3 exe程序文件是如何生成的

4372 人浏览 | 时间: 2015-08-07 14:57:32 | 作者: codexia

    我们已经了解到,如何创建Win32项目,如何写入口函数。也使用VS生成了exe程序并运行了。那么,为了更加清楚,本节就来介绍,一个exe文件是如何生成的。我们这里针对的是零基础入门的,因此这个描述过程也就简化了。
    exe文件生成过程图解如下:
    Windows零基础入门:2.3 exe程序文件是如何生成的
    我们创建的项目的作用,在这里也可以体现出来。我们使用项目组织好代码文件,那么在生成程序时调试时,都可以在VS里面快捷操作了。我相信绝大部分人使用VS,生成不少exe文件,但是却都几乎不知道如何生成的。这也就是VS开发方便的地方,你不用自己去一个个的编译源代码文件,也不用自己去链接文件,以项目的形式,以解决方案的形式组织起来,VS就可以方便管理,也可以方便的生成exe文件。
    而手动的来编译链接生成程序,你就要用命令行等,需要对着过程很清楚。事实上,我们不必那么麻烦。我只需要了解这个过程,就可以了。
    在图中可以看到,我们项目中所有的代码,以项目为单位组织在一起,那么在生成解决方案的时候,就会将这个项目的所有源码文件一次性生成了,不用手动一个个来编译。我们就把我们的所有源码文件看做一个单位。

    如果你对文本文件和二进制文件的区别不清楚,请先阅读《二进制文件和文本文件的区别图解分析》。
    如果你对编码不清楚,请先看看《字符集与字符编码的关系详细分析》和《ASCII和Unicode编码内部是什么样的》文章。
    看了上面的文章,相信应该有了不少基础了吧。我们的cpp文件,就是文本文件,也就是一堆字符。这些字符我们人很好理解。我们写的代码都是字符形式。源代码文件存在计算机中,也是二进制的。只是这个二进制并不是我们想要的计算机指令的二进制数据。cpp文件只是文件中的字符的ASCII编码的二进制格式数据而已。那么这些ASCII编码的二进制数据给计算机执行,是没用的。它不是正确的计算机指令,只是一段乱七八糟的二进制数据而已。对于CPU来说,它就是垃圾的二进制数据。因为它不认识,因为在计算机指令集中不存在这样的二进制组合。这就是我们常说的计算机为什么不认识高级语言写的代码。并不是说,源代码文件不是二进制存储的,而是存储的只是ASCII编码而已。计算机要执行的是指令,不是随便一堆二进制数据就可以的。
    那么我们要让我们的代码,形成正确的计算机指令的正确的二进制指令数据,就要使用编译器程序。不同的编程语言编译器不一样,VC++的是cl.exe,这个程序文件在【C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin】中,我是安装在C盘的这个目录下的。看你安装在哪里,根据这个路径的子文件夹来找,我这里是VS2015版本。
    编译器程序,会分析你写的代码的语法逻辑,生成对应的计算机指令的二进制数据,就形成了.obj文件。而这个obj文件是你其中一个cpp代码对应的二进制的指令文件,多个cpp文件就会生成多个obj文件。
    你写的代码只是你的逻辑的一部分,因为你的代码会使用很多基础的工具库之类的,那么那些基础的工具库,就是事先写好的二进制指令文件。我们程序需要将他们与我们程序的obj文件组合在一起,才能正确执行。所以这个工作就是链接器link.exe完成的。链接器程序文件和编译器程序文件在同一个文件夹下。这样处理之后,都整合到一个文件了,那么这个文件就是exe文件了。
    这里没有写太多的复杂的过程,就是一个翻译代码为二进制指令,这样的二进制指令计算机才认识。然后要将多个部分的指令组合在一起,形成一个完整的程序文件。这里解释了计算机为什么不理解我们的代码,才需要编译。这是编译的作用。链接器的作用用于组装。其实生成过程就这么简单。而在VS中使用,更简单,直接启动调试,他就全部自动完成了。
    本节课的内容,就是让你理解,你写的程序怎么来的,为什么需要这几个步骤。如果你对其中还有不解,请在文章后面提问。

请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制

Win32课程菜单