GCC的使用

来源:互联网 发布:python 3.2.5.msi下载 编辑:程序博客网 时间:2024/06/07 14:12
GCC 的使用

GCC是Linux系统中最为著名得编译器,它是由Richard Stallman在1984年编写的,当时仅仅把它当作一个免费的,能够被使用和修改的C语言编译器。

 一、GCC的基本使用

     与很多Linux上的软件一样,GCC也是一款开源的软件,GCC经过几年得发展不仅能够支持C语言,还支持Ada,C++,Java,Pascal等多种语言,因此当前得GCC已变成了GNU编译器家族(GNU Compiler Collection)除了支持众多开发语言外,GCC也对各种硬件平台进行支持,正是由于这种跨平台的能力,加速了GCC成为Linux首选的编译器

1、GCC基础

      由于GCC支持多种语言,因此GCC能够支持多种文件后缀的编译后缀名意义

      .c   C源文件.C

      /.cpp/.cc/.cxxC++源文件

     .h头文件
     .m Object C源文件

      .i  已经预处理过的C源文件

      .ii已经预处理过的C++源文件

      .s汇编语言源文件

      .o 目标源文件

      .a 编译后得静态库文件
      .so 编译后得动态库文件

2、GCC的编译方式

      GCC指令得一般格式:

      gcc [选项] 源文件名 [选项] 目标文件名

     ◆采用默认得方式编译源文件,系统会生成a.out可执行文件

     ◆采用显式编译成目标文件,在编译成可执行文件

      gcc -c hello.c

      gcc -o hello hello.o

     ◆直接编译成可执行文件

     gcc -o hello hello.c

    3、GCC编译流程
编译器的输入是程序的源文件,输出是可执行得文件或者可分发得二进制代码,中间过程便是编译器要完成得工作。其程序得编译流程为:

      程序的编译流程图

     事实上编译器也是按照上图中的流程来进行编译的,分为四个步骤:

     ◆预处理

      本阶段是针对头文件(.h)进行编译,即将这些头文件编译到当前源文件中,预处理常用得选项是-E,它的作用是告诉编译器,当预处理结束后停止编译。

     预处理的输入是.c文件,输出是.i文件

    命令:gcc -E 源文件 -o 目标文件

    ◆编译
    本阶段是对代码得规范性,语法得正确性进行检查,并编译成汇编语言。编译常用的选项是-S,它的作用是告诉编译器,当编译结束时,停止编译。

     编译的输入是.i文件,输出是.s文件

     命令:gcc -S源文件 -o  目标文件

     ◆汇编
     本阶段是将汇编语言翻译成目标文件,汇编常用的选项是-c,它的作用是告诉编译器,当汇编阶段结束时停止编译
     汇编的输入是.s文件,输出是.o文件
      命令:gcc -c 源文件 -o 目标文件
     ◆链接
     本阶段是将所有的目标文件以及相应的库文件编译成可执行文件,链接并不需要选项,只需要制定生成的可执行文件名。
      链接的输入是.o文件,输出是可执行文件
      命令:gcc 源文件 -o 目标文件
     4、GCC命令分类
      GCC有12类选项,分别是总体选项、语言选项、预处理选项、汇编器选项、链接器选项、目录选项、警告选项、调试选项、优化选项、目标选项、机器相关选项、代码生成选项。
      ◆总体选项
       总体选项是GCC中最常用的选项
参数名   意义
 -E           只进行预处理
 -c            将源文件生成目标文件
 -S            生成汇编文件
 -o             outfile

                               输出的结果放到outfile文件中

  -g            在可执行程序中添加调试代码

  -v           打印出编译器编译过程中的信息

-static      静态链接库

-llibrary    链接名为library得库文件
◆目录选项
目录选项用于搜索编译时头文件、库文件或者编译器其他参数得路径
参数名    意义

-I dir         用于添加头文件查找目录
-L dir        用于添加库文件查找目录
-B prefix   在何处寻找可执行文件、编译器自己得数据文件
◆警告选项
警告选项用于显示程序在编译时的警告信息
参数名       意义
-ansi          支持符合ANSI标准的所有C程序
-w               关闭所有警告
-wall           允许发出所有有用的警告信息
werror        把所有得警告转换成错误信息,并在出现错误时终止编译
-pedanti     允许发出所有标准C程序得警告信息
-pedanti -erroc   允许发出所有标准C程序得警告信息
 ◆调试选项

  调试选项用于用户程序得调试


参数名   意义

-g            产生调试信息,GDB能使用这些调试信息
-ggdb     以本地格式输出调试信息,是GDB的扩展
-gstabs   以stabs方式输出调试信息
-gstabls+   以stabs方式输出调试信息,不过只有GDB能够读取这些信息
-gcoff        以coff格式输出调试信息
-gxcoff       以xcoff格式输出调试信息
   ◆优化选项
    优化选项用于GCC对可执行代码进行优化操作,通常会用到得是O、O0、O1、O2|、O3五种优化方式,通常O后面得数字代表优化的效果,数字越大,优化的内容就越多。
    【注意】这里得优化是指编译时的优化,有时候为了实现程序的高效率执行,需要在程序代码上做代码级的优化。

 Gcc -o hello1 hello.c -O1

Gcc -o hello2 hello.c -O2

Gcc -o hello hello.c -O

Gcc -o hello0 hello.c -O0

Gcc -o hello3 hello.c -O3
GDB使用

     GDB是GNU组织在Linux系统中发布的程序调试器,它功能强大,使用方便,已经成为Linux系统中C/C++程序调试的必备工具。

1、 GDB命令
GDB是Linux系统上的一款强有力的调试工具,它能够帮助开发者观察程序运行时的内部结构和内存的使用状态。

       一般说来,GDB能够完成4个方面的工作:

● 调试程序:支持程序代码级调试,可以一行一行地执行程序代码

● 动态断点设置:可以动态设置断点,设置设置条件表达式,并自定义程序停止或运行

● 检查运行状态:提供丰富的检查机制,能够查看变量,内存等感兴趣资源的使用状况

● 执行环境动态改变:支持动态改变程序的执行环境

1、 GDB的启动

GDB有两种加载被调试程序的方式:一种是在启动时输入gdb filename,可以自动加载被调试文件,另一种是在启动GDB后输入file filename,其中file是GDB内置命令,用于指明要加载的调试文件。

     在使用GDB时,要注意一点是,被调试的可执行程序在编译时,一定要打开-g选项,不然没有办法使用GDB。另外GDB中执行调试的命令是run,即成功加载被调试文件后,输入run才可以在GDB中执行被调试的可执行文件。

2、 GDB的退出

退出GDB的命令是quit,输入quit后即可退出GDB,有时候可能需要只终止被调试的可执行程序,这时候可以输入kill命令,kill的意义是终止当前正在调试的程序。

2、 GDB命令的分类

GDB的命令可分为5类,运行环境设置与查看、断点设置与恢复、源码查看、程序数据查看和运行参数设置。

1、 运行环境设置与查看

   运行环境设置与查看包括在GDB中设置环境变量、查看环境变量、设置程序的运行路径、查看已设的路径、设置工作目录、查看工作目录、shell命令等。

命令名

意义

set environment var[=value]

设置环境变量,其中var是环境变量名,value为变量的值

Show environment[var]

查看环境变量

Path dirpath

设置程序的运行路径,其中dirpath为运行路径名

Show path

查看程序运行路径

Cd dir

设置工作目录,其中dir为工作目录名

Pwd

查看工作目录

Shell command

支持shell命令,其中command为命令名

2、 断点设置与恢复

断点设置与恢复是程序调试中最频繁的操作,GDB中提供了丰富的断点设置与恢复的调试命令。

参数名

意义

Break[断点名]

设置断点,断点名可以是行号、函数名,甚至是条件表达式

Tbreak[断点名]

与break类似,采用此种方式设置断点,断点执行后,会自动取消该断点

Step/F11

单步执行,若有函数调用,会进入函数内部

Next/F10

但不运行,若有函数调用,不会进入函数内部

Continue

继续运行,直至下一个断点或程序结束

Finish

运行程序,直至当前函数完成,并打印函数返回时堆栈地址、返回值及参数值等信息

Delete[断点名]

删除指定断点

Disable[断点名]

停止指定断点

Enable[断点名]

恢复指定被disable停止的断点

Clear

清除所有断点,若有delete不使用参数,可达到同样效果

Ignore[断点名][n]

对指定的断点忽略n次

Condition[断点

名]<条件表达式>

为指定的断点修改条件表达式



3、 源码查看

参数名

意义

List [var]

列出当前源码,var可以是行号,也可以是函数名

Info line

查看GDB中加载到内存中的源码

Forware-search

正则表达式,从当前位置向前搜索满足条件的源代码

Reverse-search

正则表达式,从当前位置向后搜索满足条件的源代码

4、

程序数据查看参数名

意义

Print[var]

输出表达式或变量的值

X[n/f/u]

输出内存变量的数据,其中n:长度,f:格式,u:从当前位置向后的长度

Watch[var]

为变量var设置观察点,若变量值有变化,则停止程序

Rwatch[var]

为变量var设置观察点,当变量的值被读取时,停止程序

Awatch[var]

为变量var设置观察点,当前的值被修改时,停止程序

Info watchpoints

显示所有观察点

Display[var]

显示表达式或变量的值

5、 运行参数设置时

运行参数设置是指在程序运行时,设置相应变量的值,它的基本设置命令是set。

参数名

意义

Set args 值1...

指定程序运行时的参数以及值

Show args

显示运行参数值

Set var=value

为程序中指定的变量设置值

 

 

 

 

0 0
原创粉丝点击