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把编译过程分为两步:
- 生成二进制文件.o文件
- 使用.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 中修改就是永久修改,修改完成生效,从新打开的终端生效
相关文章:

9/24作业
1. 分文件编译 分什么要分文件编译? 防止主文件过大,不好修改,简化编译流程 1) 分那些文件 头文件:所有需要提前导入的库文件,函数声明 功能函数:所有功能函数的定义 主函数:main函数&…...

Leetcode 106. 从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出:[3…...

针对考研的C语言学习(定制化快速掌握重点1)
1.printf函数的几个要点 printf函数中所有的输出都是右对齐的,除非在%后面添加负号,则表示左对齐 #include<stdio.h> int main() {int num 10;int nums 100;float f 1000.2333333333;printf("%3d\n", nums);//%3d表示输出的总宽度至…...
【大数据入门 | Hive】DDL数据定义语言(数据库DataBase)
1. 数据库(DataBase) 1.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; 案例: (1)创建一个…...

CNVD漏洞和证书挖掘经验总结
前言 本篇文章主要是分享一下本人挖掘CVND漏洞碰到的一些问题,根据过往成功归档的漏洞和未归档的漏洞总结出的经验,也确实给审核的大佬们添了很多麻烦(主要真的没人教一下,闷着头尝试犯了好很多错误,希望各位以后交一个…...
阿里rtc旁路推流TypeScript版NODE运行
阿里云音视频服务云端录制typescript版本; 编译后可以使用 node index.js运行 package.json 版本 // npm install --save alicloud/rtc201801112.3.0 "alicloud/rtc20180111": "^2.3.0",引入 import Client, { StartCloudRecordRequest, StopCloudRecord…...
计算机书籍分享
0.简介 数据库系统概念、深入理解计算机系统、领域驱动设计、Linux高性能服务器编程 高清版本pdf 1.链接 数据库系统概念: 链接: https://pan.baidu.com/s/17zz7QFevV2Eni9qHJyLEGA 提取码: wfrx 深入理解计算机系统 链接: https://pan.baidu.com/s/19yiJG8GqHJR…...
处理ASAM-MDF格式的开源python库asammdf
asammdf是一个强大的Python库,专为处理ASAM(Association for Standardization of Automation and Measuring Systems)MDF(Measurement Data Format)文件而设计。MDF是一种用于存储测量和诊断数据的标准格式,…...
物业管理小程序开发
物业小程序的开发是一个综合性的项目,旨在提升物业管理效率和增强业主的服务体验。以下是关于物业小程序开发的一些关键方面: 一、需求分析 目标用户:识别主要用户群体,包括业主、租户、物业管理人员等。 功能需求: 物…...
【Vue】Pinia
系列文章目录 第八章 Pinia 文章目录 系列文章目录前言一、安装和配置:二、基本使用三、一个更真实的例子 前言 Pinia是Vue.js应用程序的状态管理库。它提供了一种简单,轻量级的解决方案,用于在Vue应用程序中管理和维护状态。Pinia库的特点…...

帕金森病患者的生命长度:科学管理与乐观心态是关键
在快节奏的现代生活中,健康成为了我们最宝贵的财富之一。然而,当“帕金森病”这个名词悄然进入我们的视野时,不少人心中难免会涌起一丝不安与担忧。帕金森病,作为一种常见的神经系统退行性疾病,确实给患者的日常生活带…...
详解Linux中cat命令
在 Linux 命令的世界中,cat 命令就像是一位多才多艺的艺术家,它能够将文本文件的美妙旋律编织在一起,或者单独演奏它们的每一个音符。下面,让我们以一种充满情感的方式,用 Markdown 格式来探索 cat 命令的多种用途。 …...

Mysql高级篇(中)—— SQL优化之查询截取分析
SQL优化之查询截取分析 一、慢查询日志(1)简述(2)如何开启(3)慢查询日志分析工具介绍(了解)(4)官方工具 mysqldumpslow简述如何使用 二、SHOW PROCESSLIST三、(了解&…...
企业如何制作一个官方网站?
随着实体宣传的减弱,提高线上的宣传是新式的宣传方式,那么企业搭建网站成为线上宣传的重要途径。企业如何去搭建网站呢?如何拥有一个专业的网站来展示企业文化和企业销售产品?今天我给大家带来干货:如何一步步构建自己…...

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)
1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么? 原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。 限…...

如何查看线程
1、首先找到我们的电脑安装jdk的位置,这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok,那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程: jconsole 这里能够罗列出你系统上的 java 进程࿰…...

详细分析Spring的动态代理机制
文章目录 1. JDK动态代理和CGLIB动态代理的区别1.1 适用范围1.2 生成的代理类1.3 调用方式 2. 问题引入3. 创建工程验证 Spring 默认采用的动态代理机制3.1 引入 Maven 依赖3.2 UserController.java3.3 UserService.java3.4 UserServiceImpl.java(save方法添加了Tra…...
Redis数据类型,使用场景,事物及分布式锁
文章目录 关于Redis1.常用数据类型1.字符串(String)2.哈希(Hash)3.列表(List)4.集合(Set)5.有序集合(Sorted Set)6.位图(Bitmap)7.超日…...

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

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度
1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”,其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”,其他默认 …...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...