系统编程--gcc编译与gdb调试工具

gcc编译四步骤

简介

在这里插入图片描述
以上是gcc编译的四步骤,每个步骤生成对应的文件

补充1:
其中,.i文件,还是C/C++源代码
.s文件,已经是汇编语言代码了
.o文件,是机器语言,二进制

补充2:
在win平台下,会根据不同的编译器,在不同阶段对应着不同后缀的文件,但其内容、功能是一样的,只是后缀不同
其中,.o文件,在MinGw32/GCC编译器下是.o,在MSVC编译器下是.obj

.out会变为.exe

注意点

1、默认情况下,使用gcc对源文件进行编译
语法:gcc 源文件名 -o 设置编译好的文件的名字
然后执行
语法:./编译好的文件的名字

2、不过不加-o 那么最后生成的可以执行的文件就是上图中的a.out

3、如果加上上图步骤中的参数,会生成该步骤之前所有的文件,因为文件生成是一层层递进的,不是独立的
例如:gcc -S
不仅仅生成了hello.s 同时还生成了hello.i

4、我们可以使用-o,对任意阶段生成的文件进行重命名,如果不重命名,那么就是上图中默认的文件名

5、当有多个源文件互相配合时,我们可以多文件联编,最终生成一个可执行文件,要注意,这些文件中,必须且有且只能有一个含有main的源文件
在这里插入图片描述
假如说源文件在不同的目录,那就把目录指定上,-I,用来指定头文件所在目录(精确到目录,无需精确到文件)

6、我们在编译生成文件时,可以规定文件存放的位置:
在这里插入图片描述
如上图,-o后面,是规定了add.o的位置

参数

在这里插入图片描述
在这里插入图片描述
-c 生成二进制文件,也就是只完成到汇编阶段
-g 编译时添加调试语句,加上该选项后,生成的可执行文件可以进行gbd调试
-Wall 显示所有的警告信息

-I

该选项用于指定头文件的位置
一般适用于,头文件与源文件分离,分别在不同的文件,并且头文件与源文件不在同一个目录下
在这里插入图片描述
在同一个目录下的语法:
直接用gcc对源文件进行编译
gcc 源文件 -o 可执行文件命名
在这里插入图片描述
不在同一个目录下时:
gcc 源文件名 -o 对生成的文件命名 -I+头文件所在目录(注意精确到所在目录即可,无需精确到头文件本身)

-D

向程序注册宏定义
在这里插入图片描述
首先明确:对于上图中的程序,如果没有#define HELLO
那么HI的宏定义就不会起作用

上图是正常无错误的源文件,用紫色线标出#define HELLO
下图所用的源文件,是没有上面的那个用紫色标出的语句的

下图在编译阶段,对HELLO进行注册
就相当于上图中的#define HELLO
所以,宏定义HI起了作用

适用于当做一个开关,比如我们想要调试语句起作用,编译时就注册上那个关键的宏定义,而调试完成后,无需删除调试代码,编译时不进行关键的宏定义的注册,就相当于忽略掉了调试语句
在这里插入图片描述

补充

在这里插入图片描述

c++

对于c++编译,推荐安装gcc-c++(也称为g++)
这样,我们就可以使用g++编译器进行编译了
在这里插入图片描述
ps:若要加c++11标准,则在g++时,加上-std=c++11

gdb调试工具

简介

在这里插入图片描述
gdb调试工具是用来调试逻辑错误的,而不是用来调试语法错误的
对于语法错误是使用上面的gcc编译

补充小tips:
对于一个代码程序,对于库函数,可以将光标移动到函数名,使用K,可以跳转到该函数的文档
对于自定义函数名,使用* 或者 # 可以跳转到具体实现语句

操作

准备工作

在这里插入图片描述
想要使用gdb调试,要在gcc编译时,加上-g选项,这样生成的可执行文件就可以使用gdb调试工具了

在这里插入图片描述
之后,使用gdb命令进入gdb调试
gdb 可执行程序名

在这里插入图片描述
之后输入list 1
会显示源码,以十行显示
之后一直输入(小L)
会一直以十行显示后续代码

设置断点

b 加行号
在这里插入图片描述

运行

输入 r
在这里插入图片描述

打印

p 一个变量,可以打印当前变量的值
在这里插入图片描述

从当前位置继续向下持续运行

在这里插入图片描述
continue 从目前位置向下继续运行,直到遇到断点,如果后续没有断点,那么直接运行到程序结束

逐条执行、下一步

在这里插入图片描述

s就是逐条进行,如果当前停在函数调用语句,会进入函数内部继续执行
n就是下一步,如果当前停在函数调用语句,不会进入函数内部,而是执行该函数,然后来到该语句的下一行

如果遇到库函数,要使用n,不要使用s,这样会进入到库函数定义,脱离了我们
的程序(如果不小心进入,使用until + 函数结束行号可以出来):

在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值