9/24作业

1. 分文件编译

分什么要分文件编译?

防止主文件过大,不好修改,简化编译流程

1) 分那些文件

头文件:所有需要提前导入的库文件,函数声明

功能函数:所有功能函数的定义

主函数:main函数,所有的函数调用

2) 头文件的格式

头文件需要有防止头文件重复包含的机制

#ifndef __文件名大写_H__
#define __文件名大写_H__#endif

3) 如何编译

分文件编译的代码需要将两个.c联合编译

gcc main.c add.c

2. Makefile

Makfile是一个工程管理文件

作用:帮助程序员,简化编译流程

1) 理论基础

gcc分步编译:(分为4步)

预处理 -----> 编译 ------> 汇编 ------>链接

Makefile把编译过程分为两步:

  1. 生成二进制文件.o文件
  2. 使用.o文件完成最后的链接过程

2) Makefile文件的作用

简化了编译流程,可以完成每次不需要把全部的源文件都重新编译

如果源文件发生修改,只需要重新编译发生修改的源文件即可,节省了编译时间

Makefile会检查文件的时间戳,如果有文件时间戳更新(改文件就会重新生成)

3) make工具

sudo apt-get install make

make工具是读Makefile文件使用的,Makefile文件是make工具的唯一读入文件,

如果Makefile和makefile同时存在,make工具会自动读入小写的makefile文件

make的标准使用格式:
make 目标    --->  直接运行Makefile中指定目标的那一条规则

如果直接在终端输入make并回车,make工具会自动执行Makefile中第一个目标

make -f 文件名 目标名    ---> 不读入默认文件,读入指定文件的指定目标

4) Makefile文件的书写

Makefile文件由:规则、变量、条件编译、函数构成

5) 规则的构成

Makefile由多条规则构成,每一条规则包含

目标:依赖

<tab>指令

#这是一条规则
目标:依赖
    指令               #指令前面一定是一个tab键不是四个空格
#一般指令是依赖生成目标的过程

一条规则中一定要有一个目标,一条规则中可以有多个依赖
一条规则可以没有依赖,只执行某些指令
一条规则可以没有指令,只描述目标和依赖之间的关系

6) 第一个版本Makefile

all:main    # 一般makefile中的第一个目标都是all:可执行文件
# 为了保证,最后Makefile文件执行后一定会生成一个可执行文件main:main.o add.o gcc main.o add.o -o main
main.o:main.cgcc -c main.c -o main.o
add.o:add.cgcc -c add.c -o add.oclean:            # 删除生成的中间文件和可执行文件rm *.o main

makefile会自动进行推导(makefile没每次运行前,会自动生成文件依赖树)

7) Makefile中的变量

i) 自定义变量

变量名=变量的值    (Makefile中赋值运算两侧可以有空格也可以没有)
使用变量的值: ${}、$()、$    --->  推荐使用 $()和shell做区分

=   : 递归赋值  (以最后一次赋值为准)
+=  : 追加赋值(追加新的值)
:=  : 立即赋值(当前是什么值就立即赋值)
?=  : 条件赋值(判断之前是否定义,如果定义,不重新赋值,否则赋值)

ii) 预定义变量

系统预先定义好的一些变量,可能有默认值可能没有

RM 文件删除程序的名称,默认值为 rm -f

CC C编译器的名称,默认值是cc

CPP C预编译器的名称,默认值是 $(CC) -E

CFLAGS C编译器的选项,无默认值

OBJS 生成的二进制文件或者目标文件,自己定义的

8) 第二个版本Makefile

引入变量

EXE=main        # 保存可执行文件
OBJS=main.o add.o
CC=gcc            # Makefile中表示使用的编译器
CFLAGS=-c -g -Wall -o    # -g:调试    -Wall:显示警告all:$(EXE)    
$(EXE):$(OBJS)$(CC) $(OBJS) -o $(EXE)
main.o:main.c$(CC) $(CFLAGS) main.o main.c
add.o:add.c$(CC) $(CFLAGS) add.o add.cclean:$(RM) $(OBJS) $(EXE)

9) 引入自动变量和通配符

自动变量:
$@    目标文件的完整名称
$<    第一个依赖文件
$^    所有不重复的依赖文件。以空格分开

通配符:
*:通配所有的情况
%:是一种(字符串的)模式匹配,在Makefile中的作用是,有一个.o,就匹配一个同名的.c
%.o:%.c ------>从上一条规则中,获取到需要两个.o文件,fun.o和main.o,使用%进行模式匹配

10) 第三个版本Makefile

EXE=main
OBJS=main.o add.o
CC=gcc
CFLAGS=-c -g -Wall -oall:$(EXE)    
$(EXE):$(OBJS)$(CC) $^ -o $(EXE)
%.o:%.c$(CC) $(CFLAGS) $@ $<clean:$(RM) $(OBJS) $(EXE)

11) 伪目标

在Makefile中,有些目标并不需要生成文件,也没有文件依赖,往往把这样的目标定义为伪目标,为了防止,因为存在和目标同名的文件而不能执行目标的情况发生。

直接将目标定义为伪目标.PHONY

.PHONY:目标

伪目标的作用:不会检查时间戳,直接执行规则中的内容

EXE=main
OBJS=main.o add.o
CC=gcc
CFLAGS=-c -g -Wall -oall:$(EXE)    
$(EXE):$(OBJS)$(CC) $^ -o $(EXE)
%.o:%.c$(CC) $(CFLAGS) $@ $<.PHONY:clean
clean:$(RM) $(OBJS) $(EXE)

12) 引入函数

make中提供了内置函数

因为内置函数是帮助程序员查找文件信息的,所以要求在查找路径下,只要程序需要的.c文件,没有其他程序的.c文件

i) wildcard

功能:根据给定的条件,获取指定的文件名(找文件名的功能)

$(wildcard 指定字符串的格式)

$(wildcard *.c) ---> 找到当前路径下,所有.c文件的文件名

ii) patsubst

功能:模式匹配替换字符串

$(patsubst 源格式,目标格式,要替换的字符串)······
$(patsubst %.c,%.o,main.c add.c)    --->  获取到 main.c add.c字符串,根据模式匹配,得到 main.o add.o 字符串
每一个参数之间以逗号作为分隔,要替换的字符串之间以空格作为分隔

13) 第四版Makefile

EXE=main
FILES=$(wildcard *.c)
OBJS=$(patsubst %.c,%.o, $(FILES))
CC=gcc
CFLAGS=-c -g -Wall -oall:$(EXE)    
$(EXE):$(OBJS)$(CC) $^ -o $(EXE)
%.o:%.c$(CC) $(CFLAGS) $@ $<.PHONY:clean
clean:$(RM) $(OBJS) $(EXE)

3. gdb调试工具

1) gdb调试的作用

gdb用于调试代码中逻辑错误,而非语法错误

2) gdb调试流程

1. 生成可以使用gdb调试的只执行文件
gcc -g xxx.c    --->  生成的文件可以使用gdb调试
2. 进入到gdb工具
gdb 可执行文件名    --->  使用gdb工具开始调试可执行文件

r/run:运行代码
l/list:显示当前行下面的10代码
b/break 函数名/行号:添加断点
info b:查询断点信息
d/delete num:删除断点
p/print 变量名:查看变量的值
s/step:单步调试程序,如果是函数会进入
n/next:单步调试程序,如果是函数整体执行,不会进入
help:帮助
q:退出调试工具

i) 运行代码

ii) 查看代码

iii) 设置断点

  • 现在add函数处添加了断点,然后直接运行程序
  • 然后就停在了第5行(实际上是从第12行调用的),也就是在add中return的位置

● 执行 n 指令,继续走一步,来到第6行

● 再次执行 n 指令,也就是 num 赋值完毕,来到第13行

● 按下回车,执行上一次的指令,也就是 n,执行 pintf 语句打印信息,显示了下一行语句:return 0;

iV) 打印变量的值

V) 断点情况
  • 查看断点

  • 删除断点

3) 调试core文件

core何时生成:当程序出现重大错误时,会生成一个临时的镜像文件,保存程序状态(段错误)

由于系统的权限问题,不是每一次段错误都会生成core文件

ulimit -a  查看文件的权限
help ulimit

core file size如果为0该文件不会生成

ulimit -c unlimited 使用指令取消限制

如果使用了 ulimit -c unlimited 后,还不能在当前目录下生成core文件

在终端执行以下指令
sudo bash -c "echo core > /proc/sys/kernel/core_pattern"

需要同时gdb可执行文件和 core文件

gdb a.out core
程序会停在发生错误的一行

4) 调试正在运行的程序

需要在后台运行可执行文件

./a.out &    --->  会在终端回显进程号
gdb -p 进程号

补充

history-历史记录查询

直接执行history名显示HISTSIZE条历史记录。

history 10 -> 只显示10条历史记录

echo $HISTSIZE --> 在终端显示环境变量HISTSIZE的值

家目录下隐藏文件 .bash_history 保存历史记录,保存HISTFILESIZE 条

终端关闭,终端上执行的命令刷新到文件中。

环境变量的值可以被更改:

export HISTSIZE=20 临时修改,只有在本文件中打开这个终端有效

家目录下 文件 .bashrc 中修改就是永久修改,修改完成生效,从新打开的终端生效

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

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

相关文章

【AI视频】Runway:Gen-2 图文生视频与运动模式详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | Runway 文章目录 &#x1f4af;前言&#x1f4af;仅图片生成视频方法一&#xff1a;通过Midjourney生成图片方法二&#xff1a;通过Runway预览生成图片注意点 &#x1f4af;图加文生成视频方式一&#xff1a;Midjourney…

中年被裁,记录下这段时间的心路历程,内含前端面试题和面经

前言 真正的转变都是痛苦且无声的。 大家好啊&#xff0c;好久不见&#xff0c;停更了一个月了&#xff0c;最近确实没时间更新我的公益服游戏&#xff0c;这段时间我经历了工作被裁员&#xff0c;学习复习&#xff0c;面试找工作&#xff0c;到最终找到工作。想把这段时间我的…

为什么 ECB 模式不安全

我们先来简单了解下 ECB 模式是如何工作的 ECB 模式不涉及链接模式&#xff0c;所以也就用不着初始化向量&#xff0c;那么相同的明文分组就会被加密成相同的密文分组&#xff0c;而且每个分组运算都是独立的&#xff0c;这也就意味着可以并行提高运算效率&#xff0c;但也正是…

电脑ip地址怎么换地区:操作步骤与利弊分析

在当今全球化的信息时代&#xff0c;人们经常需要访问不同地区的网络资源。然而&#xff0c;由于地理位置的限制&#xff0c;某些内容或服务可能只对特定地区的用户开放。这时&#xff0c;更换电脑IP地址的地区就成为了一个实用的解决方案。本文将详细介绍两种更换电脑IP地址地…

WebRTC关键技术及应用场景:EasyCVR视频汇聚平台高效低延迟视频监控解决方案

众所周知&#xff0c;WebRTC是一项开源的实时通信技术&#xff0c;它通过集成音频、视频和数据传输到Web浏览器中&#xff0c;使得实时通信变得简单且无需任何插件或第三方软件。WebRTC不仅是一个API&#xff0c;也是一系列关键技术和协议的集合&#xff0c;它的出现改变了传统…

羽毛球场馆预约系统,便捷管理预约

全国羽毛球运动的热度不断上升&#xff0c;在健身行业中掀起了一股羽毛球热潮。同时羽毛球运动的风靡&#xff0c;也吸引了不少人入局&#xff0c;各种大大小小的羽毛球馆不断出现&#xff0c;为大众的羽毛球喜好提供了场地。 随着互联网的发展&#xff0c;羽毛球馆也开始向线…

共享单车轨迹数据分析:以厦门市共享单车数据为例(六)

副标题&#xff1a;.基于POI数据的站点功能混合度探究——以厦门市为例 为了保证数据时间尺度上的一致性&#xff0c;我们从互联网上下载了2020年的POI数据&#xff0c;POI数据来源于高德地图 API平台,包括名称、大小类、地理坐标等。并将高德地图 POI数据的火星坐标 系 GCJ-0…

idea 创建多模块项目

一、新建项目&#xff0c;创建父工程 新建项目&#xff0c;选择 spring initializr 填写相关信息后提交 删除不相关的目录&#xff0c;如下 修改打包方式为 pom&#xff0c;在 pom.xml 文件中新增一行&#xff0c;如下 二、创建子模块 新增子模块 填写子模块信息&#x…

《机器学习》周志华-CH8(集成学习)

8.1个体与集成 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类器系统&#xff0c;基于委员会的学习。 同质”集成“&#xff1a;只包含同种类型的个体学习器&#xff0c;同质集成中的个体学习器亦称“基学习器”&#xff0…

C# winforms 使用菜单和右键菜单

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

累加求和-C语言

1.问题&#xff1a; 计算123……100的和&#xff0c;要求分别用while、do while、for循环实现。 2.解答&#xff1a; 累加问题&#xff0c;先后将100个数相加。要重复进行100次加法运算&#xff0c;可以用循环结构来实现。重复执行循环体100次&#xff0c;每次加一个数。 3.代…

【C++掌中宝】C++ 中的空指针救世主——nullptr

文章目录 1. 什么是 NULL&#xff1f;2. NULL 在 C 和 C 中的区别3. C11 引入 nullptr 的原因4. nullptr 与 NULL 的区别5. nullptr 的应用场景6. 模拟 nullptr 的实现7. 总结结语 1. 什么是 NULL&#xff1f; 在 C 和 C 编程中&#xff0c;NULL 常用于表示空指针&#xff0c;…

如何修改音频的音量增益

一、前言 在开发音频相关的功能&#xff08;比如说语音通话、播放音乐&#xff09;时&#xff0c;经常会遇到音量太小的问题&#xff0c;这时候就需要我们对原始数据进行处理。本文将介绍如何通过修改原始音频数据来增加增益&#xff0c;本文包含如下内容&#xff1a; 1.音频数…

【Java】虚拟机(JVM)内存模型全解析

目录 一、运行时数据区域划分 版本的差异&#xff1a; 二、程序计数器 程序计数器主要作用 三、Java虚拟机 1. 虚拟机运行原理 2. 活动栈被弹出的方式 3. 虚拟机栈可能产生的错误 4. 虚拟机栈的大小 四、本地方法栈 五、堆 1. 堆区的组成&#xff1a;新生代老生代 …

速通LLaMA3:《The Llama 3 Herd of Models》全文解读

文章目录 概览论文开篇IntroductionGeneral OverviewPre-TrainingPre-Training DataModel ArchitectureInfrastructure, Scaling, and EfficiencyTraining Recipe Post-TrainingResultsVision ExperimentsSpeech Experiments⭐Related WorkConclusionLlama 3 模型中的数学原理1…

目标检测系列(一)什么是目标检测

目录 一、相关名词解释 二、目标检测算法 三、目标检测模型 四、目标检测应用 五、目标检测数据集 六、目标检测常用标注工具 一、相关名词解释 关于图像识别的计算机视觉四大类任务&#xff1a; 分类&#xff08;Classification&#xff09;&#xff1a;解决“是什么&…

【LLM开源项目】LLMs-微调框架-LLaMA-Factory入门指南v3.0

【#】SFT 训练 项目地址&#xff1a;https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/sft.html 可以使用以下命令进行微调&#xff1a; llamafactory-cli train examples/train_lora/llama3_lora_sft.yamlexamples/train_lora/llama3_lora_sft.yaml 提供…

车辆识别数据集,图片数量20500,模型已训练200轮

车辆识别数据集&#xff08;Vehicle Recognition Dataset, VDRD&#xff09; 摘要 VDRD 是一个专为车辆识别设计的大规模数据集&#xff0c;它包含了20500张不同类型的汽车、货车、公交车以及其他类型车辆的图像。数据集提供了四种车辆类别&#xff1a;汽车、货车、其他车辆和…

单片机原理及应用

单片机原理 一、单片机概述1.1 各种单片机系列1.2嵌入式处理器1.2.1 嵌入式DSP1.2.2 嵌入式微处理器 二、AT89S522.1 硬件组成2.2 引脚功能2.2.1 电源、时钟引脚2.2.2 控制引脚2.2.3 并行I/O口引脚 2.3 AT89S52单片机的CPU2.3.1 运算器2.3.2 控制器 2.4 AT89S52单片机的存储器结…

【代码随想录训练营第42期 Day60打卡 - 图论Part10 - Bellman_ford算法系列运用

目录 一、Bellman_ford算法的应用 二、题目与题解 题目一&#xff1a;卡码网 94. 城市间货物运输 I 题目链接 题解&#xff1a;队列优化Bellman-Ford算法&#xff08;SPFA&#xff09; 题目二&#xff1a;卡码网 95. 城市间货物运输 II 题目链接 题解&#xff1a; 队列优…