在大学里面大家都用过VC6.0来进行编程。VC6.0属于集成开发环境,一份代码从文本变成可执行的程序只需要在其中点击几个按钮就行了,加之老师也只教过我们如何操作,并未介绍C语言的执行过程。上一篇曾提到过,Linux下的开发环境没有集成,需要一个一个操作。这固然不如VC6.0方便,但学会如何使用gcc编译器工具后,可以使我们加深对C语言执行过程的理解,这是非常重要的。
gcc编译C程序的主要过程包括:预编译(Preprocessing)——编译(Compilation)——汇编(Assembly)——连接(Linking/Build) 四个过程,每个过程都分别进行不同的处理,下面假设已经写好了一个文件:hello.c,并以此为例仔细介绍。
一、预编译
该过程会对各种预处理指令(以#开头的代码行,如#include,#define,#ifdef等等)进行处理,删除注释和多余的空白字符。
命令:gcc -E hello.c -o hello.i
对命令的解释:E是参数,是通知gcc对hello.c进行预编译; o是参数,是对命令输出结果进行导入操作,这里是将gcc -E hello.c操作结果输出到文件hello.i(这里文件名可以自定义)进行保存。
注:Linux对大小写敏感,此处必须为大写E。
二、编译
该过程会对代码进行语法、语义分析和错误判断,生成汇编代码文件。
命令:gcc -S hello.i -o hello.s
对命令的解释:S是参数,用于通知gcc对目标文件hello.i进行编译。
三、汇编
该过程会将汇编代码转化为计算机可识别的二进制文件。
命令:gcc -c hello.s -o hello.o
对命令的解释:c是参数,用于通知gcc对木匾文件hello.s进行指令转换操作。
注:可以通过命令“readelf -a hello.o”将hello.o转变为我们可以读懂的形式。
四、连接
该过程就是将多个******.o文件合并成一个可执行文件(也就是二进制指令),类似windows下的.exe文件。
命令:gcc hello.o -o hello
对命令的解释:hello就是我们最后能够直接运行的可执行文件。
注:可以通过命令“objdump -d hello”将该可执行文件hello转变为汇编语言;也可以通过readelf来读该文件内容。
五、运行程序
直接双击输出的可执行文件hello无效,需要通过命令行来使它运行。
命令:./hello
六、小结
其实,并不需要这么多步操作,只需要对最开始的文本文档hello.c执行命令“gcc hello.c -o hello”,即可生成计算机可执行文件hello,然后执行命令“./hello”即可运行命令。之所以有这么多步,只是方便我们对C语言的编译过程有个更深刻的了解。