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

本文介绍Linux下的GCC编译器使用方法及GDB调试工具的基本操作。涵盖GCC的预处理、编译、汇编和链接过程,以及常用编译选项说明。同时,详细解释如何利用GDB设置断点、运行程序、单步执行和检查变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,如果在当前目录中没有找得到需要的文件,就到指定的路径名目录中去寻找。

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

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

答:gccfile.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、付费专栏及课程。

余额充值