关于GCC编译流程的学习

GCC 仅仅是一个编译器,没有界面,须在命令行模式下使用。通过gcc命令将源文件编译成可执行文件

1.生成可执行程序

其中a.out就是最终生成的可执行文件

如果不想使用默认的文件名,那么可以通过-o选项来自定义文件名

因为 Linux 下可执行文件的后缀仅仅是一种形式上的,所以可执行文件也可以不带后缀

2.运行可执行程序

 

实际上,gcc命令也可以将编译和链接分开,每次只完成一项任务。

1.编译(Compile)

将源文件编译成目标文件需要使用-c选项

一个源文件会生成一个目标文件,多个源文件会生成多个目标文件,源文件数目和目标文件数目是一样的。

通常情况下,默认的目标文件名字和源文件名字是一样的。

如果希望自定义目标文件的名字,那么可以使用-o选项

这样生成的目标文件的名字就是 a.o

2.链接(Link)

gcc命令后面紧跟目标文件的名字,就可以将目标文件链接成为可执行文件

其中a.out即为生成的可执行文件

gcc命令后面紧跟源文件名字或者目标文件名字都是可以的,gcc命令能够自动识别到底是源文件还是目标文件。

如果是源文件,那么要经过编译和链接两个步骤才能生成可执行文件;如果是目标文件,只需要链接就可以了

使用-o选项仍然能够自定义可执行文件的名字

GCC编译器在编译一个C语言程序时需要经过以下 4 步:

  1. 将C语言源程序预处理,生成.i文件。
  2. 预处理后的.i文件编译成为汇编语言,生成.s文件。
  3. 将汇编语言文件经过汇编,生成目标文件.o文件。
  4. 将各个模块的.o文件链接起来生成一个可执行程序文件

图片来源网络。

.i文件、.s文件、.o文件可以认为是中间文件或临时文件,如果使用 GCC 一次性完成C语言程序的编译,那么只能看到最终的可执行文件,这些中间文件都是看不到的,因为 GCC 已经将它们删除了。

gcc 几个常用选项

  • -c                        编译、汇编指定的源文件,但是不进行链接
  • -S                       编译指定的源文件,但是不进行汇编
  • -E                       预处理指定的源文件,不进行编译
  • -o [file1] [file2]    将文件 file2 编译成可执行文件 file1
  • -g                       生成调试信息,该程序可以被调试器调试
  • -Wall                  生成所有警告信息