day5gdb调试模式和makefile

news2024/12/25 9:18:28

一、gdb调试

1.1gdb调试的作用

gdb调试检查的是逻辑错误,而非语法错误

1.2gdb流程

1、gcc -g 1.c ---->加-g参数的作用,生成可以调试的gdb文件
2、gdb 可执行文件名/a.out   ---->进入gdb工具进行调试
3、输入l,带行号打印文件信息
4、打断点,b 行数  
5、打完断电后,运行程序,输入r/run  ----->停在断点的位置
6、n(next) ---->进入下一步,终端回显的代码是即将执行的代码而不是已经执行的代码
   s(step) ---->s进行单步执行可以进入函数的内部
7、p  变量名   ----->打印变量的值
8、q 退出gdb调试 

二、Makefile

2.1gcc的编译流程

预处理:gcc -E 1.c -o 1.i    ----->gcc  -E  -o  1.i  1.c      删除注释, 替换宏定义,展开头文件,不检查语法错误,生成编译文件 
编译:gcc -S -o 1.s 1.i     检查语法错误,生成汇编文件
汇编:gcc -c -o 1.o 1.s     生成二进制文件
链接:gcc -o 1 1.o            链接库

根据上面的编译流程,在生成可执行文件前,会生成一个中间二进制文件,对于源代码没有修改过的文件,不需要重新生成二进制文件。

2.2分文件编译存在的问题

在分文件编译时,常用的编译操作,gcc *.c ----->编译所有的.c文件
不论文件是否更新,都需要重新编译,浪费时间

2.3介绍Makefile

Makefile是一个工程管理文件,简化编译的流程,完成自动化编译的过程
在Makefile中,会把编译的过程分为两步,先生成.o文件,再对.o文件链接,生成可执行文件

2.4make工具

make是一个GNU的工具,make会读入文件并完成自动化编译的过程,
make默认读入文件是名为Makefile和makefile的文件,
如果makefile和Makefile同时存在,默认读入makefile
可以使用-f参数指定make工具的读入文件 ----->make -f Makefile clean

2.5Makefile的语法规则

Makefile由变量,函数和规则构成

2.6Makefile中规则的构成

目标:依赖
<tab>指令

注意事项:
1、一条规则必须有一个目标
2、一个目标可以有多个依赖
3、一条规则可以没有依赖,只完成相关的指令
4、一条规则可以没有指令,只描述依赖关系 

2.7第一版Makefile

#是Makefile中的注释
在这里插入图片描述

all:fun      #一般Mkefile会有一个all目标
#该目标通常写在Makefile中的第一个位置,用于保证Makefile文件一定会生成一个可执行性文件

main.o:main.c
    gcc -c main.c -o main.o
fun:main.o fun.o
    gcc main.o fun.o -o fun
fun.o:fun.c
    gcc -c -o fun.o fun.c
clean:
    rm *.o fun

2.8引入Makfile中的变量

= 递归赋值    ---->取变量最后一次的值
+= 追加赋值   ---->把值追加到原有值的后面,并带空格
:= 即赋值   ---->在哪赋值在哪展开
?= 件赋值   ---->如果前面出现过该变量,就不赋值否则赋值

递归赋值
在这里插入图片描述

立即赋值
在这里插入图片描述

追加赋值
在这里插入图片描述

条件赋值
在这里插入图片描述

Makefile中的自动变量
都是针对一条规则而言的

$@:所有目标
$^:所有依赖    
$<:第一个依赖

2.9第二版Makefile

EXE=fun     #定义EXE表示可执行文件名
OBJs+=main.o  #定义中间代码文件(二进制文件)
OBJs+=fun.o
CC=gcc      #定义编译器gcc为CC变量
CFLAGs=-c -g -o   #定义CFLAGs保存gcc的编译参数


all:$(EXE)      #一般Mkefile会有一个all目标
#该目标通常写在Makefile中的第一个位置,用于保证Makefile文件一定会生成一个可执行性文件

$(EXE):$(OBJs)
    $(CC) $^ -o $@
main.o:main.c
    $(CC) $(CFLAGs) $@ $^
fun.o:fun.c
    $(CC) $(CFLAGs) $@ $^
clean:
    rm $(OBJs) $(EXE)

2.10第三版的Makefile---->引入通配符

引入%通配符做模式匹配,能实现目标和依赖之间的唯一匹配关系

EXE=fun     #定义EXE表示可执行文件名
OBJs+=main.o  #定义中间代码文件(二进制文件)
OBJs+=fun.o
CC=gcc      #定义编译器gcc为CC变量
CFLAGs=-c -g -o   #定义CFLAGs保存gcc的编译参数


all:$(EXE)      #一般Mkefile会有一个all目标
#该目标通常写在Makefile中的第一个位置,用于保证Makefile文件一定会生成一个可执行性文件

$(EXE):$(OBJs)   
    $(CC) $^ -o $@
%.o:%.c
    $(CC) $(CFLAGs) $@ $^
clean:
    rm *.o $(EXE)

%.o:%.c ----->会根据上面规则提供的依赖文件,找到OBJs里面的所有.o文件
main.o ---->%会自动获取到main,并且继续匹配%.c--->%.c会被展开为main.c

2.11引入内置函数

使用以下内置函数时,要求工作路径下,只存在可执行文件需要的.c文件
i)wildcard
获取当前工作路径下,所有满足格式的文件
$(wildcard 指定的文件格式)
$(wildcard *.c) ----->获取当前路径下的所有.c后缀的文件
ii)patsubst
模式匹配,把指定格式符字符串替换为另一个格式
$(patsubst 模式1,模式2,要转换的字符串)
$(patsubst %c,%o,1.c 2.c 3.c····· )

把用wildcard找到的所有.c文件文件名,转换成.o的字符串

EXE=fun     #定义EXE表示可执行文件名
files=$(wildcard *.c)   #使用内置函数wildcard获取当前路径下的所有.c文件 
OBJs=$(patsubst %.c,%.o,$(files))
CC=gcc      #定义编译器gcc为CC变量
CFLAGs=-c -g -o   #定义CFLAGs保存gcc的编译参数


all:$(EXE)      #一般Mkefile会有一个all目标
#该目标通常写在Makefile中的第一个位置,用于保证Makefile文件一定会生成一个可执行性文件

$(EXE):$(OBJs)     #main.o  fun.o
    $(CC) $^ -o $@
%.o:%.c
    $(CC) $(CFLAGs) $@ $^

.PHONY:clean     #clean可以作为一个伪目标,这个目标不生成任何文件直接执行规则里的指令
clean:
    rm *.o $(EXE)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/850242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管理类联考——逻辑——论证逻辑——汇总篇——目录+提炼

文章目录 一、削弱方法关系的削弱必要方法的削弱因果推理的削弱果因推理的削弱概念跳跃的削弱数量比例的削弱比例因果的削弱 二、支持方法关系的支持必要方法的支持因果推理的支持果因推理的支持概念跳跃的支持数量比例的支持比例因果的支持 三、假设方法关系的假设必要方法的假…

不分股权不分管理,只分利润:共享模式的新零售布局

实体行业如何通过共享模式去整合那些有资源的人&#xff0c;来完成新零售的一个布局&#xff1f;比如对于餐饮行业而言&#xff0c;一样的资源&#xff0c;经常有用餐、聚餐需求的人是谁&#xff1f; 有商会组织者、公司的管理层、培训机构、社群群主等等。那么如何把这些人整…

记一次Linux启动Mysql异常解决

文章目录 第一步&#xff1a; netstat -ntlp 查看端口情况2、启动Mysql3、查看MySQL日志 tail -100f /var/log/mysqld.log4、查看磁盘占用情况&#xff1a;df -h5、思路小结 第一步&#xff1a; netstat -ntlp 查看端口情况 并没有发现3306数据库端口 2、启动Mysql service …

【Windows】Windows11系统用户自己添加开机启动项的方法

按win R快捷键&#xff0c;打开运行窗口&#xff0c;在输入框中输入shell:startup后点击运行&#xff0c;打开启动文件夹&#xff1a; 把想增加的开机启动软件的快捷方式图标拖入到该文件夹中&#xff0c;如下图所示&#xff1a; 按ctrl shift esc打开任务管理器&#xff0c…

UWB伪应用场景 - 别再被商家忽悠

近几年UWB技术在网上宣传得如火如荼&#xff0c;与高精度定位几乎或等号&#xff0c;笔者认为这是营销界上的一大成功案例。 UWB超宽带技术凭借着低功耗、高精度&#xff0c;确实在物联网行业混得风生水起&#xff0c;但在无数实际应用案例中&#xff0c;根据客户的反馈情况&a…

python小游戏代码200行左右,python小游戏代码1000行

大家好&#xff0c;小编为大家解答20行python代码的入门级小游戏的问题。很多人还不知道python小游戏代码200行左右&#xff0c;现在让我们一起来看看吧&#xff01; 大家小时候都玩过贪吃蛇吧&#xff1f;小编小时候可喜欢拿爸妈的手机玩了&#xff0c;厉害着呢&#xff01;今…

Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发

今日目标 掌握纯注解开发依赖注入(DI)模式 学习使用纯注解进行第三方Bean注入 1 注解开发依赖注入(DI)【重点】 问题导入 思考:如何使用注解方式将Bean对象注入到类中 1.1 使用Autowired注解开启自动装配模式&#xff08;按类型&#xff09; Service public class StudentS…

redis基础(三十六)

安装redis、配置redis 目录 一、 概述 &#xff08;一&#xff09;NoSQL 1、类型 2、应用场景 &#xff08;二&#xff09;Redis 二、安装 &#xff08;一&#xff09;编译安装 &#xff08;二&#xff09;RPM安装 三、目录结构 四、命令解析 五、redis登录更改 1、…

三层交换实验

前言 在实际的企业应用中&#xff0c;我们会先建立不同的vlan把用户先隔开来。然后再通过三次交换机技术打通vlan直接的网络。 这样的目的如下&#xff1a; 隔离&#xff1a; 隔离是广播域&#xff0c;也就是隔离的是故障连通&#xff1a; 连通的是正常的通信 比如校园网&am…

在魔塔社区搭建通义千问-7B(Qwen-7B)流程

复制以下语句 python3 -m venv myvenvsource myvenv/bin/activatepip install modelscope pip install transformers_stream_generator pip install transformers pip install tiktoken pip install accelerate pip install bitsandbytestouch run.py vi run.py复制下面代码粘…

IMV5.0

背景内容&#xff1a; 经历了多个版本&#xff0c;基础内容在前面&#xff0c;可以使用之前的基础环境&#xff1a; v1&#xff1a; https://blog.csdn.net/wtt234/article/details/132139454 v2&#xff1a; https://blog.csdn.net/wtt234/article/details/132144907 v3&#…

04-8_Qt 5.9 C++开发指南_QTableWidget的使用

文章目录 1. QTableWidget概述2. 源码2.1 可视化UI设计2.2 程序框架2.3 qwintspindelegate.h2.4 qwintspindelegate.cpp2.5 mainwindow.h2.6 mainwindow.cpp 1. QTableWidget概述 QTableWidget是Qt中的表格组件类。在窗体上放置一个QTableWidget 组件后,可以在 PropertyEditor…

二、 MySQL 内部技术架构

二、 MySQL 内部技术架构 047 Mysql内部支持缓存查询吗&#xff1f; 当MySQL接收到客户端的查询SQL之后&#xff0c;仅仅只需要对其进行相应的权限验证之后&#xff0c;就会通过Query Cache来查找结果&#xff0c;甚至都不需要经过Optimizer模块进行执行计划的分析优化&…

产品缺陷管理软件:了解功能与选择要点

在现代社会&#xff0c;产品缺陷管理软件已经成为了各个行业必不可少的工具。它可以帮助企业更好地管理和解决产品中存在的缺陷问题&#xff0c;提高产品质量和客户满意度。然而&#xff0c;市场上存在着众多的产品缺陷管理软件&#xff0c;如何选择一款好用、适合自己的软件成…

Java实现数字加密

Java实现数字加密 需求分析代码实现小结Time 需求分析 1.首先&#xff0c;考虑方法是否需要接收数据处理&#xff1f; 需要一个4位数&#xff0c;至于是哪一个数&#xff0c;让方法的调用者传递。 所以&#xff0c;方法的参数&#xff0c;就是这个需要加密的四位数 2.接着&…

Unity 编辑器资源导入处理函数 OnPostprocessAudio :深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPostprocessAudio 用法 点击封面跳转下载页面 简介 在Unity中&#xff0c;我们可以使用编辑器资源导入处理函数&#xff08;OnPostprocessAudio&#xff09;来自定义处理音频资源的导入过程。这个函数是继承自AssetPostprocessor类的&#xff…

电压信号转电流信号

用运算放大器配置电流&#xff0c;使其既能做同相放大电路&#xff0c;也能把电压转化为电流信号 1、当SW1断开情况下&#xff0c;OUT的电压仅受U1.3产生的同相放大电路有关&#xff0c;把0-3V输入转换成0-10V 2、当SW1闭合时 设输入INT的电压信号为Vi&#xff0c;负载电阻R8的…

04-7_Qt 5.9 C++开发指南_QTreeWidget和QDockWidget

文章目录 1. 实例功能简述2. 源码2.1 可视化UI设计2.2 mainwindow.h2.3 mainwindow.cpp 1. 实例功能简述 本节介绍 QTreeWidget、QDockWidget 的使用&#xff0c;以及用 QLabel 显示图片的方法。实例 samp4_8以QTreeWidget 为主要组件&#xff0c;创建一个照片管理器&#xff…

分享:2023新手做闲鱼电商如何轻松过万。详细步骤分享

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 如果一个人想赚很多钱&#xff0c;他必须学会从小钱开始。如果他想赚一点钱&#xff0c;他必…

springboot(2)

springmvc 把软件系统分为3个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器 &#xff08;Controller&#xff09;。 模型&#xff08;Model&#xff09;&#xff1a;Model是由一个实体Bean实现的&#xff0c;是数据的载体…