gcc封装了程序的整个编译过程,包括 预编译/编译/汇编。
预编译:把c文件#开头的宏定义展开,处理后得到i后缀文件,如hello.i,这个文件就不会再有#define,#ifdef之类的宏。对应的gcc参数是-E,表示执行完预编译就结束。cpp的文件会被展开为hello.ii。
例子:
gcc -E hello.c -o hello.i
编译:把展开后的文件转化为汇编语言,这里有严格的语法/文法要求,是最高深的部分,要学汇编原理才能搞懂。得到hello.s文件。对应的gcc参数为-S,表示执行完编译就结束。
例子
gcc -S hello.i -o hello.s 或者 gcc -S hello.c -o hello.s
其实-S调用了/usr/lib/gcc/x86.../4.4/cc1这个程序。-S会根据不同的语言,来调用不同的编译工具。可见,实际执行汇编的不是gcc本身。
汇编:把汇编语言变为机器代码。对应gcc参数为-c,表示执行完所有编译流程。
例子
gcc -c hello.c -o hello.o
三者的参数不用死记,忘记了就man gcc看一下就行了
GCC(1) GNU GCC(1)
NAME
gcc - GNU project C and C++ compiler
SYNOPSIS
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
第一行就是输入参数,最后一行就是输出参数-o