GCC 编译器
Linux下使用最广泛的 C/C++ 编译器是 GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将 GCC 作为Linux下首选的编译工具。GCC 仅仅是一个编译器,没有界面,必须在命令行模式下使用。通过gcc命令就可以将源文件编译成可执行文件。
1、通过gcc命令一次性完成编译和链接的整个过程
大家在学习C语言的过程中一般都这么做,最方便。
1) 编写源文件
$ cd demo #进入源文件所在目录
$ touch hello.c #使用 touch 命令创建一个名为 hello.c 的空文件
$ gedit hello.c #使用 gedit 命令编辑hello.c
2)生成可执行程序
$ gcc hello.c #在 gcc 命令后面紧跟源文件名
注意:不像 Windows,Linux 不以文件后缀来区分可执行文件,Linux 下的可执行文件后缀理论上可以是任意的,这里的.out只是用来表明它是 GCC 的输出文件。
不管源文件的名字是什么,GCC 生成的可执行文件的默认名字始终是a.out。
如果不想使用默认的文件名,那么可以通过-o
选项来自定义文件名,例如:
$ gcc hello.c -o hello.out
这样生成的可执行程序的名字就是hello.out
。
🐖 因为Linux下可执行文件的后缀仅仅是一种形式上的,所以可执行文件也可以不带后缀
🐖 通过-o
选项也可以将可执行文件输出到其他目录,并不一定非得在当前目录下,如$ gcc hello.c -o ./out/hello.out
3)运行可执行程序
在控制台中输入程序的名字就可以,如下所示:
$ ./a.out
🐖 如果程序在其它目录下,运行程序时还要带上目录的名字,例如: $ ./out/hello.out
2、gcc命令分步骤编译的过程
实际上,gcc命令也可以将编译和链接分开,每次只完成一项任务。
GCC的翻译过程可以分成四个阶段:预处理器、编译器、汇编器、链接器,执行这四个阶段的程序一起构成了一个编译系统。
1)预编译(生成.i文件)
预编译器cpp把源文件和相关的头文件(如实例代码中的头文件stdio.h)预编译成一个.i的文件。
执行的命令:gcc -E hello.c -o hello.i
预编译的作用:
a、处理所有的“#include”预编译指令
b、处理所有的"#define"指令,将代码中所有的"#define"删除,并展开所有的宏定义
c、处理所有的条件预编译指令,如#if #elif #else #ifdef #ifnodef #endif等
d、删除所有的注释
e、添加行号和文件名标识,以便产生错误时给出提示信息
2)编译(生成.s文件)
编译器gcc把预处理后的文件进行语法分析、语义分析以及优化后生成汇编代码文件。
执行的命令:gcc -S hello.i -o hello.s
3)汇编(生成.o文件)
汇编器把汇编代码文件转换成中间目标文件
执行的命令:gcc -c hello.s -o hello.o
(注意:这里是小写的-c,而不是大写的-C)
4)链接(生成可执行文件)
链接器ld把目标文件与所需要的所有的附加的目标文件(如静态链接库、动态链接库)链接起来成为可执行的文件
执行的命令:gcc hello.o -o hello