岔路口1.1、编译是如何进行的?

By | 2014年12月13日

如果你对编译器是如何处理你的程序,并将其变为一个可执行程序的过程感到好奇,那么你可以往下阅读本文的内容。

在这篇文章里,我们将了解编译中的预处理、编译、连接等过程,并熟悉gcc的一些命令。

在开始我们的操作之前,我们需要先来设置环境变量(如果你是linux用户,那么恭喜你,你可以直接开始下面的实验)。你可能想问:环境变量是个什么东西?

很好,现在请你打开命令提示符,然后输入gcc并且回车。如果你之前没有装过相关软件,或者是做过相关的设置,那么它应该会显示下面的内容。

错误信息

错误信息

因为命令行程序并不知道gcc这个程序到底在哪儿,所以他会显示这个错误。如何使用这个程序呢,我们有两种办法。

第一种,你可以切换到gcc程序所在的目录。你可能不知道你计算机上的gcc安装在哪儿。其实它就藏在codeblocks的安装目录下。

现在请切换到codeblocks的安装目录,如果你有困难,请搜索,或者浏览本文预备章中的文字。

codeblocks下的文件

codeblocks下的文件

在codeblocks目录下,通常有这样一些文件,我们不需要去了解这些文件是干嘛的,我们现在只需要清楚gcc在那个目录,答案就是mingw这个目录

我们cd进去,再dir一下

mingw下的文件

mingw下的文件

可我还是没有看到gcc。别急嘛,我们离他就只有一层目录里,他就在bin这个文件夹下面,请cd进去,并列出目录,看看gcc.exe是不是在这个目录内。

输入gcc后

输入gcc后

现在显示出来了这个东西,恭喜你,你刚才已经成功运行了gcc这个程序,至于为什么显示这个错误信息,是因为gcc这个程序不知道我们要他干嘛,于是显示了这个出错的信息。

下面请记住gcc所存放的目录,记不住也不要紧,在黑框框内右键,有一个“标记”选项,点了之后,将你当前的路径复制下来。不会用?以上图为例,在d盘的d上点鼠标左键,不要放开,向右移动,到bin后面的n上,松开左键,再点击一下右键。你会发现你选中的白色区域又消失了,这说明上面的路径已经成功复制到了剪切板中。

在你成功完成上面一步后,我们就可以开始设置环境变量来,请先输入下面的命令

输入set path之后

输入set path之后

显示的结果在不同的计算机上不同,但都会有一个path=,以及一个pahtext=

我们不必管第二个,请看path=后面(可能很长一串),注意最后是否有一个分号,图中的wbem后有一个分号(一般都会有,没有也不要紧)

现在请接着输入下面的内容

设置环境变量

输入下面的内容

首先是 set path=%path%gcc所在目录;

切记,一定不要忘记了写%path% ,如果你之前的path=后面的文字最后没有分号,那么你还需要在第二个百分号后加上一个分号,像这样 set path=%path%;gcc路径…。同时,也别忘了在gcc路径最后加上一个分号。

如果你刚才是复制的路径,那么在输入%path%之后,右键,会有一个粘贴(切记,在命令提示符程序下没有Ctrl+V这种粘贴方法!),点一下粘贴,刚才复制的内容就会显示出来。

在执行完上面一个命令后,再次输入set path,看看在最后是不是多了一个你刚才加入的路径呢?

为了验证设置是否成功,现在请将目录切换到其他地方,比如根目录,输入cd \即可回到根目录。然后输入gcc,如果显示和刚才一样的错误,而不是xxx不是命令批处理这种东西,说明你的设置是成功的。

可别把这个命令行窗口关掉了,如果你已经这样做了,请允许我为你默哀一秒钟。因为这个更改只会在设置的窗口下有效,在关掉窗口后会自动失效,所以如果你关闭了窗口,你需要重新完成以上步骤。

如果你还没有关掉窗口,那么让我们继续

我们依然以hello world这个程序为例。请用codeblocks新建一个项目(如果你还没有创建过hello world这个项目,或者说创建了不知道放到了哪儿的话,否则直接跳过这一步)

复制并粘贴下面的程序,然后将程序保存

#include <stdio.h>
#define str "hello world!\n"

int main(void)
{
    printf(str);
    return 0;
}

接着把命令行切换到刚才项目的目录,列出目录,你应该看得到一个c程序

项目目录

项目目录

一般是main.c。

现在请输入gcc -E main.c -o output.txt

你会发现在这个目录下多了一个output.txt的文件

接着,输入output.txt,在打开的记事本中,你会看到一大串的文字。将他移动到最后,你会发现这样几行

文件末尾

文件末尾

这最后的几行不就是我们刚才写的程序吗,那么前面这么多东西是干嘛的呢?

还记得前面说到得include吗,他将头文件包含进来。没错,前面的那么多东西都是include这个命令产生的。

我们刚才看到的就是我们写的源程序预处理完毕后的结果。你可能已经注意到,我们程序中的printf(str);到这里却变成了hello wolrd,这说明在预处理阶段,#define的内容都会被替换。

下面我们接着来看

输入gcc -S main.c -o output.txt,然后打开output.txt

汇编

汇编

这些乱七八糟的东西,其实就是传说中的汇编了。

在汇编之后,编译器会生成一个目标文件,

请输入gcc -c main.c -o output.txt,现在如果你打开了这个txt,你会发现里面的内容比上面更乱,因为目标文件是二进制文件,当作字符处理当然会乱码!

最后,我们再输入gcc main.c -o output.exe

这样会生成一个叫做output的exe,运行它,他将显示一行hello world。

到这里,你应该对编译的流程有了更深的了解。

首先预处理器对我们的源程序进行预处理,然后交给编译器编译成二进制目标文件。然后链接器再把目标文件链接成为可以执行的exe程序

这就是本文所要教你的内容。讨厌的第一章到这里也结束了。如果你不觉得累的话可以接着往后看。

发表评论

邮箱地址不会被公开。 必填项已用*标注