day5gdb调试模式和makefile

一、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.cgcc -c main.c -o main.o
fun:main.o fun.ogcc main.o fun.o -o fun
fun.o:fun.cgcc -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.hqwc.cn/news/58870.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、web核心防御机制(上)

文章目录 一、Web应用程序与风险1.1 Web应用程序的发展历程1.2 Web应用程序安全 二、核心防御机制2.1 处理用户访问2.2 处理用户输入2.2.1输入的多样性2.2.2 输入处理方法2.2.3 边界确认2.2.4 多步确认与规范化 一、Web应用程序与风险 1.1 Web应用程序的发展历程 在因特网发展…

旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?

齐奏AI交响曲的当下&#xff0c;赛道玩家各自精彩。其中&#xff0c;被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆&#xff0c;并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型&#xff0c;AI四小龙谁都不甘其后。 以深耕AIoT软硬一…

14_基于Flink将pulsar数据写入到HBase

3.7.基于Flink将数据写入到HBase 3.7.1.编写Flink完成数据写入到Hbase操作, 完成数据备份, 便于后续进行即席查询和离线分析 3.7.1.1.HBase基本介绍 hbase是基于Google发布bigTable论文产生一款软件, 是一款noSQL型数据, 不支持SQL. 不支持join的操作, 没有表关系, 不支持事…

Nacos基本应用

Nacos 基本应用 Nacos 提供了 SDK 和 OpenAPI 方式来完成服务注册与发现等操作&#xff0c;SDK 实际上是对于 http 请求的封装。 微服务架构的电子商务平台&#xff0c;其中包含订单服务、商品服务和用户服务。可以使用 Nacos 作为服务注册和发现的中心&#xff0c;以便各个微…

链式二叉树统计结点个数的方法和bug

方法一&#xff1a; 分治&#xff1a;分而治之 int BTreeSize1(BTNode* root) {if (root NULL) return 0;else return BTreeSize(root->left)BTreeSize(root->right)1; } 方法二&#xff1a; 遍历计数&#xff1a;设置一个计数器&#xff0c;对二叉树正常访问&#…

protobuf 2定义string常量

背景 protobuf 2中定义的enum枚举值必须为数字类型&#xff0c;故不支持string类型&#xff0c;但有些业务场景又确实需要定义string常量。 目标 在protobuf 2中定义string常量。 方案 思路&#xff1a;通optional default实现string常量。 细节&#xff1a; 1、protobu…

论文浅尝 | 面向多步推理任务专业化较小语言模型

笔记整理&#xff1a;张沈昱&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理 链接&#xff1a;https://github.com/FranxYao/FlanT5-CoT-Specialization 动机 本文的动机是探索如何在多步推理任务中通过大型语言模型提升较小的语言模型的性能。作者认为&#xff0…

AVS3:跨多通道预测PMC

前面的文章中介绍了TSCPM&#xff0c;它是AVS3中用于intra模式的跨通道预测技术&#xff0c;它利用线性模型根据亮度重建像素预测色度像素&#xff0c; 跨通道预测技术用于去除不同通道间的冗余信息&#xff0c;TSCPM可以去除Y-Cb、Y-Cr通道间的冗余&#xff0c;然而却忽略了…

什么是训练数据?

算法从数据中学习。算法从得到的训练数据中找到关系&#xff0c;形成理解&#xff0c;做出决策&#xff0c;并评估信心。训练数据越好&#xff0c;模型的表现就越好。 实际上&#xff0c;与算法本身一样&#xff0c;训练数据的质量和数量与数据项目的成功有很大关系。 现在&…

LeetCode150道面试经典题-删除有序数组中的重复项(简单)

1.题目 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c…

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群&#xff0c;其架构如上图所示&#xff…

libmpv使用滤镜处理视频进行播放

一、前言 作为一个功能强大的多媒体框架,libmpv为开发者提供了广泛的功能和灵活的控制权。滤镜是libmpv的一个重要特性,允许开发者对视频进行各种实时处理和增强,从而满足用户对于个性化、创意化和高质量视频体验的需求。 滤镜是一种在视频渲染过程中应用特定效果的技术。…