GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。

一、命令格式

命令格式:gcc [选项] [文件名]

<h3>编译的四个阶段:</h3>

  • -E:仅执行编译预处理;
  • -c:仅执行编译操作,不进行连接操作;
  • -S:将C代码转换为汇编代码;
  • -o:指定生成的输出文件。

-C基本说明:

–c是使用GNU汇编器将源文件转化为目标代码之后就结束,在这种情况下,只调用了C编译器(ccl)和汇编器(as),而连接器(ld)并没有被执行,所以输出的目标文件不会包含作为Linux程序在被装载和执行时所必须的包含信息,但它可以在以后被连接到一个程序
-c表示只编译(compile),而不连接成为可执行文件。生成同名字的 .o 目标文件。通常用于编译不包含主程序的子程序文件。

gcc -c hello.c

生成:hello.o

-o基本说明:

-o选项用于说明输出(output)文件名,gcc将生成一个目标(object)文件xx。

gcc hello.c -o xqf 或者
gcc -o xqf hello.c(顺序可以调换) 

输出:xqf 为程序可执行文件。

-g基本说明:

-g 选项产生符号调试工具(GNU的gdb)所必要的符号信息,插入到生成的二进制代码中。表示编译DEBUG版本。 想要对源代码进行调试,就必须加入这个选项。当然,会增加可执行文件的大小。

gcc study.c -o xqf
gcc -g study.c -o xqf_g

结果如下:(确实加了 -g 可执行文件后变大了一点)

-rwxr-xr-x 1 root root 12393 Apr 19 21:39 xqf_g
-rwxr-xr-x 1 root root 11817 Apr 19 20:48 xqf

二、gcc调试说明:

gcc 在产生调试符号时,同样采用了分级的思路,开发人员可以通过在 -g
选项后附加数字1、2、3指定在代码中加入调试信息的多少。默认的级别是2(-g2),此时产生的调试信息包括:扩展的符号表、行号、局部或外部变量信息。

级别3(-g3)包含级别2中的所有调试信息以及源代码中定义的宏。
级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储。
回溯追踪:指的是监视程序在运行过程中函数调用历史。
堆栈转储:则是一种以原始的十六进制格式保存程序执行环境的方法。