在Linux平台上,最流行的编译系统是GCC(GNU Compile Collection)。GCC也是GNU发布的最著名的软件之一。GCC的功能非常强大,主要体现在两方面。
1) GCC可以为x86、ARM、MIPS等不同体系结构的硬件平台编译程序。
2) GCC可以编译C、C++、Pascal、Java等数十种高级语言。
GCC的这两项特性对嵌入式应用开发及其重要。此外,GCC的编译效率也是非常高的,一般要高出其他编译系统20%到30%左右。所以在嵌入式Linux开发领域,使用的基本上就是GCC编译系统。
gcc命令的使用格式为:
gcc [选项] [文件名] [选项] [文件名]
gcc命令拥有数量庞大的编译选项,按类型可以把选项分为以下几大类。
总体选项:用于控制编译的整个流程。
常用选项:
-c:对源文件进行编译或汇编。
-E:对源文件进行预处理。
-S:对源文件进行编译。
-o file:输出目标文件file。
-v:显示编译阶段的命令。
语言选项:用于支持各种版本的C语言程序。
常用选项:
-ansi:支持符合ANSI标准的C程序。
警告选项:用于控制编译过程中产生的各种警告信息。
常用选项:
-W:屏蔽所有的警告信息。
-Wall:显示所有类型的警告信息。
-Werror:出现任何警告信息就停止编译。
调试选项:用于控制调试信息。
常用选项:
-g:产生调试信息。
** GCC工作流程**
在C程序的编译过程中,依次要进行预处理、编译、汇编、链接四个阶段。这里通过编译C文件test.c来展示GCC的工作流程。
- 预处理阶段
由于在hello.c(源文件)中使用了头文件stdio.h,所以GCC在编译时首先要把头文件stdio.h中的内容加载到hello.c中的首部。
在shell中输入命令“gcc -E hello.c -o hello.i”。其中,参数E告诉gcc命令只进行预编译,不做其他处理;参数o用来指明输出的文件名为test.i。命令运行完毕后就会产生一个名为hello.i的文件。
- 编译阶段
输入命令“gcc -S hello.i -o hello.s”。其中,参数S告诉gcc命令只进行编译,不做其他处理。命令运行完毕后就会产生一个名为test.s的汇编文件。
- 汇编阶段
汇编阶段的任务是把汇编程序翻译成CPU可以识别的二进制文件,该文件又称为目标文件。
在shell中输入命令“gcc -c hello.s -o hello.o”,其中,参数c告诉gcc命令只进行汇编,不做其他处理。命令运行完毕后就会产生一个名为hello.o的目标文件。
- 链接阶段
目标文件虽然已经可以被CPU直接识别,但是单个目标文件一般是无法运行的。原因在于一个程序往往是由多个源文件组成的,每个源文件只对应一个目标文件。也许有人会问,hello程序不就只有一个源文件hello.c吗,为什么也不能直接运行呢?原因是hello.c使用了stdio.h对应的库函数,所以必须要把hello.o文件和函数库文件链接在一起才能运行。
链接阶段的任务就是把程序中所有的目标文件和所需的库文件都链接在一起,最终生成一个可以直接运行的文件,称为可执行文件。
在shell中输入命令“gcc hello.o -o hello”,运行完毕后就会产生一个名为hello的可执行文件。输入命令“./hello”执行该文件,就可以得到hello文件的运行结果“Hello world!”。