各位看官们,大家好,上一回咱们说了如何使用GCC。这一回咱们说说如何使用GCC进行编译,闲话休提,
言归正转。让我们一起talk GCC吧!
看官们,GCC编译分为四个阶段:预处理,编译,汇编和链接。下面咱们说说每个阶段如何进行编译,还
是哪句话:说编译本质上就是说GCC的选项。因为不同的选项可以控制不同的编译。
预处理阶段:
该阶段使用的选项是E,会生成预处理后的产物。咱们举个例子:gcc -E filename.c这时不会生成
文件,而是把生成结果显示在执行命令的终端中。所以使用E选项时一定和o选项一起使用,这样
可以把预处理的产物写到o选项指定的产物中。例子:gcc -E filename.c -o f.i.我们可以使用文本编
辑器gedit或者VIM打开f.i文件查看。
编译阶段:
该阶段使用的选项是S,会生成编译后的产物,与就是汇编语言的源文件,文件后缀为.s。咱们举
个例子:gcc -S filename。或者gcc -S filename -o f.s.因为S选项可以默认生成filename.s文件,所
以是否使用选项o指定一个专门的文件,取决于用户自己,当然了,为了统一操作,建议大家还是
使用选项o指定一个文件。关于filename特别说明一下, 它即可以是C程序源文件,如filename.c。
也可以是预处理器生成的文件,如filename.i。不论使用哪种文件,都可以生成filename.s文件,而
且生成的文件完全一样。
汇编阶段:
该阶段使用的选项是c,会生成汇编后的产物,也就是没有链接的目标文件,文件后缀为.o。咱们举
个例子:gcc -c filename.gcc -c filename -o f.s.因为c选项可以默认生成filename.o文件,所以是否
使用选项o指定一个专门的文件,取决于用户自己,当然了,为了统一操作,建议大家还是使用选
项o指定一个文件。这点和选项S一样。在这里专门说下filename。它可以是C/C++语言的源文件,
也可以是编译器产生以.s为后缀的汇编源文件,甚至是使用预处理器生成的以后缀为i的文件都可以。
链接阶段:
该阶段不使用任何选项,会生成链接后的产物,也就是可执行的目标文件,文件后缀为.o。咱们举
个例子:gcc filename -o f.o.这里的filename可以用C/C++的源文件,或者是前面阶段生成的产物
来替换。比如.i,.s,.o文件。
下面我用一个表格来总结各个阶段使用的GCC选项,各个阶段可以处理的文件,我们叫它输入文件吧,以
及各个阶段的产物,我们叫它输出文件也可以。
阶段 | 选项 | 参数(输入文件类型) | 产物(输出文件类型) |
预处理 | E | .h,.c(c语言).C,.cc,.cxx(c++语言) | .i(c语言),.ii(c++语言) |
编译 | S | .i,.h,.c(c语言).C,.cc,.cxx(c++语言) | .s(生成汇编语言源文件) |
汇编 | c | .i,.s,.h,.c(c语言).C,.cc,.cxx(c++语言) | .o(没有进行链接的目标文件,不能运行) |
链接 | 无 | .i,.s,.o,.h,.c(c语言).C,.cc,.cxx(c++语言) | .o(有链接的目标文件,可以运行) |
通过上面的表格,以及对各个选项的说明,我们可以发现GCC的各个阶段都是相互独立的,它既可以使用
前一个阶段的产物,也可以直接使用C/C++的源文件。各个阶段都是向后兼容,可以独立处理自己阶段中
的事情,也可以处理前面阶段没有处理的事情。
看官们,关于GCC的内容,今天咱们就说这些。欲知后事如何,且听下回分解!