五、gcc编译器编译过程。
1、使用gcc编译器一步到位: gcc xxx.c -o xxx
gcc编译器
xxx.c ---------------> xxx
高级语言 目标程序(二进制文件)
2、使用gcc编译器细分每一个编译的步骤,可以分为4个步骤:
预处理 编译 汇编 链接
xxx.c ------> xxx.i -----> xxx.s ----> xxx.o ----> xxx
高级语言 目标程序(二进制文件)
3、那么这些步骤是如何处理的? -> 查看gcc用法: man gcc
1)预处理
-E Stop after the preprocessing stage; do not run the compiler proper.
//在预处理之后就停止了,不会运行编译的步骤。
例子:一个程序,如果只预处理,命令如何写?
gcc xxx.c -o xxx.i -E
file.c //C语言的文件,并且没有预处理。
C source code that must be preprocessed.
file.i //C语言文件,但是已经预处理过了。
C source code that should not be preprocessed.
结论: 预处理只是把xxx.c中的头文件,宏定义,条件编译展开
2)编译
-S Stop after the stage of compilation proper; do not assemble.
//在编译之后就停止了,不会进行汇编。
例子:一个程序,如果想编译,命令如何写?
gcc xxx.i -o xxx.s -S -> 只编译
gcc xxx.c -o xxx.s -S -> 预处理+编译
file.i //C语言文件,但是已经预处理过了。
C source code that should not be preprocessed.
file.s //汇编语言文件
Assembler code.
结论: 编译只是检查C语言的语法是否正确。
3)汇编
-c Compile or assemble the source files, but do not link.
//汇编代码,但是不连接。
例子:一个程序,如果想汇编,命令如何写?
gcc xxx.c -o xxx.o -c -> 预处理 + 编译 + 汇编
gcc xxx.i -o xxx.o -c -> 编译 + 汇编
gcc xxx.s -o xxx.o -c -> 汇编
file.s //汇编语言文件
Assembler code.
file.o //二进制文件
结论: 汇编将程序中地址重新排列。
4)链接
作用; 链接一些库文件。
例子: gcc xxx.o -o xxx
file.o //二进制文件
file //二进制文件
练习: 随便写一个.c文件,去试试这几个步骤。
gcc xxx.c -o xxx.i -E
gcc xxx.i -o xxx.s -S
gcc xxx.s -o xxx.o -c
gcc xxx.o -o xxx