GCC编译器简介:
一、基本知识了解
GCC是由gun之父Stallman所开发的linux下的编译器。全程为GNU C Complier
(GNU c语言编译器)。这是一种早期的说法,早期的时候,它只是用来编译我们的C
语言,之后可以多个我们的多门语言都可以进行编译。例如, C,C++,JAVA,ObjectC等等。
GCC是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
二、Gcc所支持的源代码格式
GCC是一个交叉平台的编译器,目前支持几乎所有主流CPU处理器平台,它可以完成从C、C++、Objective C等源文件向运行在特定cpu硬件上的目标代码的转换,目前编译器所能支持的源程序的格式如下。
后缀格式 说明
.C C语言程序
.cc/cpp C++程序
.m Object-C的原始程序
.i预处理过的C语言程序
.s汇编语言的原始程序
.o目标文件
.a/.so 编译后的库文件
三、gcc编译的流程分析
用gcc编译过C语言的同学应该都知道,我们使用gcc编译可执行文件的时候,看起来似乎仅仅通过了编译这一步就完成了。具体流程如下图。
hello.c
运行结果:
上面的步骤看起来似乎很简单那。但是,事实上,我们GCC编译器工具由C语言转换成可执行文件的过程并不单单的就是一个编译的过程。而是要经过以下几个步骤。
预处理------>编译------>汇编-------->链接
预处理阶段:就是对我们的源代码进行编译前,对我们的头文件或者宏定义进行解析。
编译:这个阶段注意是检查代码的规范性,是否有语法错误等。以确定代码的实际要做的工作。在检查无误后,就把代码翻译成汇编代码。
汇编:这个阶段就是把我们的已经生成好了的汇编代码转换成我们的目标文件(二进制)。
链接:生成可执行代码。链接所需要的库文件。普通c程序默认到/usr/lib中寻找链接的库。
四、参数分析及原理详解
刚刚我们讲解的知识是从原理的角度来给大家说明了,我们gcc的编译流程。可能大家觉得还是比较的抽象。下面,我们来从实际的代码演示的角度来看看。首先,需要了解几个选项。
<1>常用编译选项
-E 预处理选型,预处理操作的时候使用
-S 编译选项,把预处理过的代码编译成汇编代码
-c 汇编选项,生成我们的目标文件
-o 把编译的内容,指定保存到指定输出的文件。
-g 生成gdb调试所需要的符号信息
<2>代码分析
预处理
编译
汇编
链接
下面,我们来看看我们的gdb调试
Gdb调试简介
<1>C语言错误的分类
我们平时写代码的时候,写错字或者碰到一些错误的问题,总是必不可少的。那么我们该如何解决它呢?首先,我们来看看我们常见的错误类型。
(1)C语法错误
错误信息∶文件source.c中第n行有语法错误(syntex errror)
语法错误对我们来说,是由于我们对C语言的不熟悉,或者打字速度太快,不经意之间产生的。这种错误一般编译器会来帮我们检测出来。相对来说,比较容易解决。
(2)头文件错误
错误信息∶找不到头文件head.h(Can not find include file head.h)
一般来说,是我们调用的函数,没有添加头文件。例如,写了printf,却没有调用stdio.h这个头文件。或者头文件书写错误。这种也是比较容易解决的。编译器一般也会帮忙查出来。
(3)逻辑错误
这种错误是大家常常遇到的。一般来说,编译器编译通过了,并且生成了可执行文件,但是,我们执行之后,常常会发现执行的结果并不是我们想要的。这类的错误一般来说,很难查出来。
<2>gdb调试
针对逻辑错误,我们聪明的程序员开发出了一个工具,叫做GDB调试工具。类似与VC中的debug调试工具。
具体用法详解图片gdb.jpg gdb1.jpg
gdb调试段错误:
1、把core文件显示出来
ulimit -c unlimited 把core文件设置为无限大
2、编译程序 gcc -g hello.c