C语言从源代码到可执行文件需要经过以下步骤
C语言源代码->预处理->汇编->翻译->链接->计算机执行
预处理
作用: 预编译过程主要处理源代码文件中以“#”开始的与编译指令
命令:gcc -E hello.c :只做预处理,不做后续的动作。
什么是预处理命令?
所有以“#”开头的语句,都叫做预处理语句。
以下显示了部分的预处理命令
#define bit(n) (1<<(n))
#define max(a,b) (((a)>(b))?(a):(b))
#undef
#include <stdio.h>
#if 0
#ifndef
#endif
#else
#elif
#ifdef
#line
#error
#parama
预处理宏:
LINE
FILE
TIME
DATE
STDC
汇编
作用:将高级语言转换成汇编语言
命令:gcc -S hello.c :只汇编,不翻译。
编译
作用:编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译(Compile)。C语言代码经过编译以后,并没有生成最终的可执行文件(.exe 文件),而是生成了一种叫做目标文件(Object File)的中间文件(或者说临时文件)。
编译是针对一个源文件的,有多少个源文件就需要编译多少次,就会生成多少个目标文件。
命令:gcc -c hello.c :只编译,不链接。
链接
作用:编译只是将我们自己写的代码变成了二进制形式,它还需要和系统组件(比如标准库、动态链接库等)结合起来,这些组件都是程序运行所必须的。链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)。
命令:gcc *.o -o target
多个源文件的编译
1. 对每一个源文分别进行编译。gcc -c *.c -o *.o
2. 最后统一链接。gcc *.o -o target
gcc命令参数
-o :对输出的目标文件或可执行文件重命名。
-c : 只编译不链接
-I :指定头文件位置
-L :指定库文件所在的位置
-l :指定库文件名