一个编译过程包括下面几个阶段:
(1)预处理:预处理器将对源文件中的宏进行展开。
(2)编译:gcc将c文件编译成 汇编文件。
(3)汇编:as将汇编文件编译成机器码。
(4)链接:将目标文件和外部符号进行连接,得到一个可执行二进制文件。
gcc所支持的文件后缀名
test.c 表示c原始程序
test.i 表示经过预处理后的程序
test.s 经过编译后的汇编语言程序
test.o 通过汇编将编译文件转化成二进制的目标文件
gcc 参数 选项
常用参数:
-c 表示编译源文件,只进行编译不进行链接,生成目标文件test.o
-o 表示输出目标文件
-o file 将file文件指定作为输出文件
-g 表示在目标文件中产生调试信息,用于gdb调试
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-Wall 打开所有类型的警告。
如果未指定参数
gcc test.c
则会将main.c文件进行预处理、编译、汇编和链接操作,最后默认生成a.out可执行文件
如果采用-o参数指定输出目标文件的名称:
gcc test.c -o test
则最后不会生成a.out可执行文件,而是test可执行文件
预处理阶段
对包含的头文件和宏定义进行处理
gcc -E test.c -o test.i
//vim test.i
编译阶段
gcc -S test.i -o test.s
//vim test.s 查看汇编语言
汇编阶段
采用as将汇编文件译成机器码
as test.s -o test.o
但此时的test.o文件不能执行,还需要进行链接
gcc test.o -o test
此时test为可执行程序
汇编和链接可以直接一起进行执行
将.s的汇编文件和库文件链接起来直接形成可执行程序test
gcc test.s -o test