linux 下的编译器和调试器---那些年我们一起学习linux程序设计

GCC程序编译

简介

1.        Linux系统下的gcc功能功能强大、性能优越的多平台编译器。Gcc可以在多种硬件平台上编译出可执行程序,其执行效率与一般编译器相比平均效率要高20%~30%

2.        GCC编译器能将CC++语言源程序、汇编程序编译、链接成为可执行文件。

3.        linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。

4.        使用GCC编译程序时,编译过程可以被细分为四个阶段:

(1)   预处理(Pre-Processing(处理以#开头)

(2)   编译(Compiling   (编译成汇编文件)

(3)   汇编(Assembing  (编程目标文件)

(4)   链接(Linking       (把没目标文件连接在一起)

 

文件类型:

GCC通过后缀来区分:输入的类型

 

基本用法:

Gcc最基本的用法是:

              Gcc [options] [filename]

Options :编译器所需要的编译选项

Filenames: 要编译的文件名。

 

编译选项:

Gcc编译器的编译选项大约有100多个,其中多数我们根本用不到,这里只介绍其中最基本、最常用的参数。

(1)   –o  output_filename: 确定可执行文件的名称为output_filename.

如果不给出-o这个选项gcc就给出预设的可执行文件a.out

(2)   –c :只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。

(3)   –g :产生调试工具(GUNgdb)所必须的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。

(4)    -o,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。

(5)   –o –o ,-o更好的优化编译、链接,当然整个编译】链接过程会更慢。

例如:A.  gcc  optimize.c   -o    optimize

命令:time ./optimize

              B.  gcc -o  optimize.c  -o  ptimize

命令:time ./optimize

对比两次执行的输出结果,可以看到程序性能B(1.5s)的确比A6s)的快很多

 

(6)   -I 路径名:将路径名所指出的目录加入到程序头文件目录列表中。

(增加头文件按的寻找路经)

C程序中头文件包含两种情况:

I#include <A.h>

II. #include A.h

对于<>,预处理程序cpp会在系统预设的头文件目录(头文件标准寻找路径)中搜寻相应的文件;

对于“cpp会在当前目录中搜寻头文件。这个选项的作用是告诉cpp,如果在当前目录中没有找得到需要的文件,就到指定的路径名目录中去寻找。

例:gcc hello.c  -I /home/include   -o  hello  (增加头文件寻找路径,此命令,寻找头文件时也到/home/inlude目录下寻找)

当把/home/1.h也作为头文件的标准寻找路径则可以#include <1.h>怎样实现当把/home/1.h也作为头文件的标准寻找路径?

答:gcc file.c  -I  /home/include  –o   file

等效#include/home/include

 

(7)   -L 路径名:将路径名所指出的目录加入到库文件的目录列表中。在默认状态下,连接程序 ld在系统的预设中(如:/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到 –L指定的目录中去寻找,然后再到系统预设路径中寻找。

例如: gcc  hello.c  -L /home/lib  –o  hello

(8)   –l 函数库

在连接时,装载名字为“lib函数库名,例如:libname.a,该函数库位于系统预设的目录或者由 –L选定的目录下。

例如:, -lm 表示:连接名为“libm.a(lib去掉,后面的后缀.a去掉)剩下ml+m=lm的数学函数库

例如:gcc  hello.c  -lm  -o  hello

-static :静态链接库文件

例:gcc  -static  hello.c  -o  hello

库有动态和静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:

Libhello.so  libhello.a 当使用静态库时,连接器找出程序所需的函数,然后将它们考贝到可执行文件,一旦连接成功,静态库也就不再需要了。然而,对动态库而言,就不是这样,动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作时首先连接动态库。

(9)  -Wall:生成所有警告信息

   -w: 不生成任何警告信息

   -D  MACRO:定义MACRO宏,等效于在程序中使用#define  MACRO

 

GDB程序调试

 简介

GDBGNU发布的一款功能强大的程序调试工具。

GDB主要完成下面3方面的功能:

1.      启动被调试的程序;

2.      让被调试程序在指定的位置停住。

3.      当程序被停住时,可以检查程序中状态(如:变量值)

 

GDB快速进阶

1.      编译生成可执行文件:(注意要调试编译出来的程序一定要加 –g)

gcc  -g  test.c  -o  test

2.      启动GDB

gdb  执行程序名

3.      main函数处设置断点

break  main

4.      运行程序

run

5.      单步执行

next

6.      继续运行

continue

 

GDB命令

(1)   (list) l:查看程序

(2)    (break) b函数名: 在某函数入口处添加断点

(3)   (break) b行号:在指定文件的指定行添加断点

(4)   (break) b文件名:行号 再指点文件名的指定行添加断点

(5)    (break) b行号if条件 当条件为真时,指定行号处断点生效;

例如: b 5 if i=10,当i等于10时第5行断点生效

(6)   info break :查看所有设置的断点

(7)   delete断点编号:删除断点

(8)   (run) r :开始运行

(9)   (Next) n :单步运行程序(不进入子函数)

(10) (step) s :单步运行程序 (进入子函数)

(11) (Continue) c:继续运行程序

(12)(printf) p 变量名:查看指定变量值

(13)finish :运行程序,直到当前函数结束

(14)watch  变量名:对指定变量进行监控

(15)(quit ) q :退出 gdb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值