可执行文件生成过程和gcc参数介绍

文章结构

可执行文件生成过程

1. 预处理器

2. 编译器

3. 汇编器

4. 链接器

gcc参数用法

语法

参数


可执行文件生成过程

对于一个源文件test.c生成可执行文件test.out的过程如下:

可执行文件生成过程和gcc参数介绍

 1. 预处理器

输入文件:test.c

执行命令:gcc -E test.c -o test.i

功能:展开头文件、去掉注释、宏替换

输出文件:test.i

可执行文件生成过程和gcc参数介绍

2. 编译器

输入文件:test.i

执行命令:gcc -S test.i -o test.s

功能:语法检查、代码优化处理、生成汇编文件

输出文件:test.s

可执行文件生成过程和gcc参数介绍

3. 汇编器

输入文件:test.s

执行命令:gcc -c test.s -o test.o

功能:将汇编代码翻译成目标机器指令生成二进制文件

输出文件:test.o

可执行文件生成过程和gcc参数介绍

 4. 链接器

输入文件:test.o

执行命令:gcc  test.o -o test.out

功能:将函数库中用到的代码整合到目标文件中生成可执行文件;

连接类型:一种是静态链接,他会将程序会用到的库一次性全部连接到一个目标文件里面,优点是速度快,但目标文件太大;另一种是动态链接,它则是用到那个库才去动态的连接,优点是目标文件小,但速度不及静态链接。

输出文件:test.out


gcc参数用法

语法

gcc语法:

  • gcc  多个参数  输入文件,如:gcc  -o  test.exe  test.c
  • gcc  输入文件  多个参数,如:gcc  test.c  -o  test.exe
  • gcc 多个输入文件 多个参数,如:gcc a.c b.c c.c -I head -g
  • gcc 多个参数 多个输入文件,如:gcc -I head -g a.c b.c c.c

参数

  1. 查看版本号:gcc -v/--version 可执行文件生成过程和gcc参数介绍
  2. 产生目标文件并命名:-o 
    1. 命令:gcc test.c -o test.exe
    2. 作用:生成可执行文件并对其重命名
  3. 指定头文件目录:-I(大写i) + 目录
    1. 命令:gcc test.c -I 头文件所在目录 -o test.exe
    2. 作用:自顶自定义头文件路径
    3. 可执行文件生成过程和gcc参数介绍
  4. 编译时定义宏:-D + 宏定义名
    1. 命令:gcc test.c -D 宏名 -o test.exe
    2. 作用:打印调试信息,如果不在文件中#define 定义的化默认是不会打印调试信息的,如果你需打印的话这就需要加-D参数
    3. 可执行文件生成过程和gcc参数介绍
  5. 编译优化:-On (n = 0 ~ 3; -O0:没有优化; -O1:缺省值;-O2:优化级别最高)
    1. 命令:gcc test.c -O1 -o test.exe
    2. 作用:优化冗余代码,比如:int a = 10, b=a,c=b,d=c; 则可直接有为d = a;
  6. 显示提示信息: -Wall
    1. 命令:gcc test.c  -Wall -o test.ext
    2. 作用:如果有警告信息会提示,比如某个变量没有使用
    3. 可执行文件生成过程和gcc参数介绍
  7. 生成预处理文件:-E
    1. 命令:gcc -E test.c -o test.i
    2. 作用:上面已经说过了
  8. 只编译子程序:-c
    1. 命令:gcc -c test.c -o test.o
    2. 作用:在用静态库和动态库是常用来生成 .o 文件
  9. 包含调试信息:-g(gdb调试的时候必须加改参数)
    1. 命令:gcc test.c -g -o test.ext
    2. 作用:当需要调试程序的时候必须加-g,如果是程序发布的话则不用加,加-g参数会使得文件变大可执行文件生成过程和gcc参数介绍