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.mzph.cn/web/53607.shtml

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

相关文章

828华为云征文|使用Flexus X实例集成ES搜索引擎

目录 一、应用场景 1.1 Flexus X实例概述 1.2 ES搜索引擎 二、安装相关服务 2.1 安装Elasticsearch7.17.0 2.2 安装kibana7.17.0 三、开通安全组规则 四、整体感受 4.1 Flexus X实例 4.2 使用感觉 一、应用场景 1.1 Flexus X实例概述 Flexus X实例是华为云推出的一款…

力扣最热一百题——最小覆盖子串

目录 题目链接&#xff1a;76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;滑动窗口 1. 初始化 2. 构建 mapT 3. 滑动窗口 4. checkT 方法 5. 返回结果 Java写法&#xff1a; 运行时间 C写法&#x…

Hbase日常运维

1 Hbase日常运维 1.1 监控Hbase运行状况 1.1.1 操作系统 1.1.1.1 IO 群集网络IO&#xff0c;磁盘IO&#xff0c;HDFS IO IO越大说明文件读写操作越多。当IO突然增加时&#xff0c;有可能&#xff1a;1.compact队列较大&#xff0c;集群正在进行大量压缩操作。 2.正在执行…

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一&#xff1a;格式 docker rmi 要…

安卓系统常见问题如native crash,卡顿卡死定位工具命令技巧-android framework实战开发

背景&#xff1a; 有学员朋友近来有问到一些安卓系统开发过程中的一些核心小技能小技巧等&#xff0c;比如native crash在企业里面该如何准确定位具体代码函数&#xff0c;程序卡住&#xff0c;或者长时间没反应&#xff0c;想要看看卡在代码的哪里。针对以上的一些问题&#…

408选择题笔记|自用|随笔记录

文章目录 B树&#xff1a;访问节点建堆&#xff01;将结点插入空堆广义指令求每个子网可容纳的主机数量虚拟内存的实现方式文件目录项FCB和文件安全性管理级别索引文件三种存取方式及适用器件成组分解访问磁盘次数 C语言标识符 最小帧长物理传输层介质 局域网&广域网考点总…

AIGC基础工具-用于数据分析和数据处理的核心库Pandas介绍

文章目录 1. Pandas 的核心数据结构1.1 Series创建 SeriesSeries 重要属性示例 1.2 DataFrame创建 DataFrameDataFrame 重要属性示例 2. Pandas 数据的导入与导出2.1 读取 CSV 文件2.2 读取 Excel 文件2.3 写入 CSV 文件2.4 读取 JSON 文件 3. Pandas 的数据操作3.1 数据选择和…

IPsec-Vpn

网络括谱图 IPSec-VPN 配置思路 1 配置IP地址 FWA:IP地址的配置 [FW1000-A]interface GigabitEthernet 1/0/0 [FW1000-A-GigabitEthernet1/0/0]ip address 10.1.1.1 24 [FW1000-A]interface GigabitEthernet 1/0/2 [FW1000-A-GigabitEthernet1/0/2]ip address

开源 AI 智能名片与 S2B2C 商城小程序:嫁接权威实现信任与增长

摘要&#xff1a;本文探讨了嫁接权威在产品营销中的重要性&#xff0c;并结合开源 AI 智能名片与 S2B2C 商城小程序&#xff0c;阐述了如何通过与权威关联来建立客户信任&#xff0c;提升产品竞争力。强调了在当今商业环境中&#xff0c;巧妙运用嫁接权威的方法&#xff0c;能够…

AI 智能名片链动 2+1 模式商城小程序中的体验策略

摘要&#xff1a;本文探讨了在 AI 智能名片链动 21 模式商城小程序中&#xff0c;体验策略如何服务于用户体验&#xff0c;以及与产品策略的区别。重点分析了该小程序如何通过关注用户在使用过程中的流畅度、视觉体感等方面&#xff0c;实现“让用户用得爽”的目标&#xff0c;…

JS中的事件和DOM操作

一、事件[重要] 1、 事件介绍 事件: 就是发生在浏览器(页面)上一件事,键盘事件,鼠标事件,表单事件,加载事件等等 2、 事件绑定方式 事件要想发生,就得将事件和标签先绑定(确定哪个标签发生什么事情,又有什么响应) 一个完整的事件有三部分 事件源(标签),哪里发出的事. 什么事(…

德勤校招网申笔试综合能力测试SHL题库与面试真题攻略

德勤的综合能力测试&#xff08;General Ability&#xff09;是其校园招聘在线测评的关键环节&#xff0c;旨在评估应聘者的多项认知能力。以下是对这部分内容的全面整合&#xff1a; 综合能力测试&#xff08;General Ability&#xff09; 测试时长为46分钟&#xff0c;包含…

Linux 文件权限详解与管理

文章目录 前言一、文件权限概述1. 权限表示格式2. 权限组合值 二、查看文件权限三、修改文件所有者与所属组1. 使用 chown 修改文件所有者2. 使用 chgrp 修改文件所属组3. 添加所有者 四、修改文件权限1. 符号方式2. 八进制方式3. 实际修改 总结 前言 在 Linux 系统中&#xf…

VS Code调整字体大小

##在工程目录底下.vscode/settings.json添加设置参数 {"editor.fontSize": 15,"window.zoomLevel": 1.5 }

MySQL—存储过程详解

基本介绍 存储过程和函数是数据库中预先编译并存储的一组SQL语句集合。它们的主要目的是提高代码的复用性、减少数据传输、简化业务逻辑处理&#xff0c;并且一旦编译成功&#xff0c;可以永久有效。 存储过程和函数的好处 提高代码的复用性&#xff1a;存储过程和函数可以在…

Redis6.0.9配置redis集群

写在前面 最近在完成暑期大作业&#xff0c;期间要将项目部署在云服务器上&#xff0c;其中需要进行缓存的配置&#xff0c;决定使用Redis&#xff0c;为了使系统更加健壮&#xff0c;选择配置Redis-Cluster。由于服务器资源有限&#xff0c;在一台服务器上运行6个Redis Instan…

docker desktop windows stop

服务docker改为启动 cmd下查看docker版本 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://hub.atomgit.com/"]…

三目运算判断字母大小写-C语言

1.问题&#xff1a; 输入一个字符&#xff0c;判别它是否为大写字母&#xff0c;如果是&#xff0c;将它转换成小写&#xff0c;如果不是&#xff0c;不转换。然后输出最后得到的字符&#xff0c;要求使用三目运算符。 2.解答&#xff1a; 用条件表达式来处理&#xff0c;当字…

Go基础学习04-变量重声明;类型转换;类型断言;Unicode代码点;类型别名;潜在类型

目录 变量重声明 类型断言 类型转换 类型转换注意事项 Unicode代码点 类型别名、潜在类型 类型别名的意义 变量重声明 编写代码&#xff1a; package mainimport "fmt"var container []string{"Beijing", "Shanghai"}func main() {fmt.Pr…

快递物流短信API接口代码

官网&#xff1a;快递鸟 API参数 用户信息类 一.短信模版 1.接口说明 使用快递鸟短信功能时&#xff0c;预先设置好短信模板和对应的发送规则&#xff0c;快递鸟短信API将根据设置的好的模板和规则&#xff0c;进行短信的发送和反馈。 (1)仅支持Json格式。 (2)请求指令810…