Linux 学习记录39(C高级篇)

news2024/11/25 10:30:28

Linux 学习记录39(C高级篇)

在这里插入图片描述

本文目录

  • Linux 学习记录39(C高级篇)
  • 一、gdb调试工具
    • 1. gdb工具的使用
  • 二、枚举类型 enum
    • 1. 定义
  • 三、Makefile
    • 1. 什么是makefile
    • 2. 什么是Make
    • 3. Make用途
    • 4. Makefile的工作过程
      • (1. Makefile分步编译的目的
    • 5. Makefile的语法规则
    • 6. Makefile变量的赋值
      • (1. 递归赋值
      • (2. 追加赋值
      • (3. 立即赋值
      • (4. 条件赋值
    • 6. Makefile自动变量
    • 7. Makefile伪目标
    • 8. Makefile通配符
    • 8. Makefile内置函数
      • (1. wildcard
      • (2. patsubst
  • 四、
  • 思维导图

一、gdb调试工具

用于查找程序中的非语法错误

1. gdb工具的使用

需要在编译时加上参数,生成可以调试的debug的文件

gcc -g xxx.c 生成可以调试的可执行文件
gdb 可执行文件名 进入gdb工具

进入gdb工具后

  1. l:显示我加你前十行,如果我加你超过十行,再按一下l
  2. b 行数/函数名:打断点
  3. r:执行程序默认停在断点处
  4. n:单步执行,遇到函数不会进入函数内部
  5. s :单步执行,遇到函数会进入函数内部
  6. p 变量名 :打印变量
  7. q :退出gdb工具
    在这里插入图片描述

二、枚举类型 enum

1. 定义

enum 类型名
{
	枚举项1,
	枚举项2,
	枚举项3,
	...
	枚举项n,
};

1. 枚举项能直接使用
2. 枚举项默认整形常量
3. 能够给枚举项直接赋值
4. 枚举项值是按顺序递增的
5. 枚举是适用于typedef类型重定义的
6. 枚举一般用于数据间有相互关系并连续的

例:

enum week
{
    mon=1,
    tue,
    wed,
    tus,
    fri,
    sat,
    sum,
};

int main(int argc, char const *argv[])
{
    printf("%d\r\n",mon);
    printf("%d\r\n",tue);
    printf("%d\r\n",wed);
    printf("%d\r\n",tus);
    printf("%d\r\n",fri);
    printf("%d\r\n",sat);
    printf("%d\r\n",sum);
    return 0;
}

在这里插入图片描述
使用场景:用于是v要使用连续的常量,并且每个常量特殊含义的时候

三、Makefile

1. 什么是makefile

Makefile 是一个名为Makefile的工程管理文件
1. Makefile的文件名,可以是大写的Makefile也可以是小写的mkfile,一般使用大写的Makefile
2. 如果大写的Makefile 和 小写的Makefile同时存在,默认执行小写的Makefile
3. Makefile会工具文件的时间戳决定是否需要重新编译

2. 什么是Make

1. make是一个执行Makefile的工具
2. make格式:make 目标
3. make 的执行逻辑:会根据目标自动生成依赖树,通过依赖关系执行整个Makefile文件

3. Make用途

描述工程的执行过程,链接规则
完成自动化编译

4. Makefile的工作过程

一般程序编译分为4步,预处理>编译>汇编>链接
一步编译时,需要联合编译的文件,即使没有修改过也会被重新编译(效率低)
 Makefile一般把文件编译过程分为2步执行
 1. gcc -c 执行汇编操作,生成二进制文件,但是不链接
 2. 从二进制文件链接到库文件,生成可执行文件

(1. Makefile分步编译的目的

1. 一步编译会导致源文件被大量重复编译
2. 只要不链接到库,就会重新生成可执行我加你,每次只重新编译更新过的文件

5. Makefile的语法规则

Makefile主要由规则构成

Makefile由规则,变量,函数和条件编译构成
Makefile中的注释:#

规则由目标,依赖和指令构成

  1. 一条规则可以有多个目标,一个目标可以有多个依赖

  2. 一条规则必须有一个目标,

  3. 目标:依赖

指令 —>指令前面是一个tab键,不能使用4个空格代替
例:

all:../main.out #最后makfile的整体目标

clean:
	rm *.o
#清空文件

../main.out:main.o server.o sqlite.o
	gcc main.o server.o sqlite.o -lpthread -lsqlite3 -o ../main.out 
#生成的最终文件保存至上一级目录

main.o: ../main.c
	gcc -c ../main.c -lpthread -lsqlite3 -o main.o
#生成main.o文件 

server.o: ../server.c
	gcc -c ../server.c -lpthread -o server.o 
#生成server.o文件

sqlite.o: ../sqlite.c
	gcc -c ../sqlite.c -lsqlite3 -o sqlite.o 
#sqlite.o文件

6. Makefile变量的赋值

(1. 递归赋值

=
递归赋值只取最后一次的结果

var1 = 1
var2=$(var1)
var1 = 2
test:
	@echo $(var2)

输出:
在这里插入图片描述

(2. 追加赋值

+=

var1 = 1

var2+=$(var1) 3

test:
	@echo $(var2)

输出
在这里插入图片描述

(3. 立即赋值

+=

var1 = 1
var2:=$(var1) 
var1 = 2
test:
	@echo $(var2)

输出
在这里插入图片描述

(4. 条件赋值

?=
当该变量未被定义十才能被赋值

var1 = 1
var2?=2 
var1?=3
test:
	@echo $(var1)![在这里插入图片描述](https://img-blog.csdnimg.cn/9546dc1db2974918a46914db4c384f0b.png)

	@echo $(var2)

输出:
在这里插入图片描述

6. Makefile自动变量

对于命令而言

变量功能
$@所有目标
$ ^所有依赖
$ <第一个依赖

7. Makefile伪目标

.PHONY
功能:引入为目标可以解决当目标和文件名重复的问题

伪目标后面的要求:
伪目标后面的目标不管目标是文件还是指令,都执行该规则
.PHONY clean

8. Makefile通配符

%:模式匹配符
要求文件名必须同名

%.o:%.c
"自动匹配相同文件名的.c和.o文件"

8. Makefile内置函数

(1. wildcard

使用:$(wildcard 格式)
功能:模式匹配,从当前路径下找到指定格式的内容,找到后不同的内容间以空格作为分隔

$(wildcard *c) 匹配当前路径下所有的.c文件

(2. patsubst

使用:$(patsubst 格式1,格式2,要转换的文件)
功能:将

四、

思维导图

在这里插入图片描述

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

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

相关文章

【unity每日一记】那些动作基础你还记得吗—移动和旋转相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

农村电商APP软件开发 电商新农村紧跟时代脚步

互联网技术的深入发展让电子商务走向了高潮&#xff0c;不过在一些交通闭塞的乡村地区&#xff0c;电商发展还处于初期阶段。大量农产品从生产到流通渠道的变革&#xff0c;让互联网农产品成为新型农业发展的重要手段&#xff0c;不仅增加了农业产值提高了农民收入&#xff0c;…

《kafka 核心技术与实战》课程学习笔记(六)

生产者消息分区机制原理剖析 为什么分区&#xff1f; Kafka 有主题&#xff08;Topic&#xff09;的概念&#xff0c;它是承载真实数据的逻辑容器&#xff0c;而在主题之下还分为若干个分区&#xff0c;也就是说 Kafka 的消息组织方式实际上是三级结构&#xff1a;主题 - 分区…

[CKA]考试之四层负载均衡service

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 重新配置一个已经存在的front-end的deployment&#xff0c;在名字为nginx的容…

spring boot 整合EasyPoi导入导出,下载模版功能

引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></…

【算法题】链表系列之从尾到头打印链表、重建二叉树、用两个栈实现队列

【算法题】链表系列 一、从尾到头打印链表1.1、题目描述1.2、递归法1.3、栈&#xff08;stack&#xff09; 二、重建二叉树2.1、题目描述2.2、前置知识&#xff1a;2.3、分治算法2.4、小结 三、用两个栈实现队列3.1、题目描述3.2、双栈法3.3、小结 总结 一、从尾到头打印链表 …

从零开始 Spring Boot 48:JPA Hibernate

从零开始 Spring Boot 48&#xff1a;JPA & Hibernate 图源&#xff1a;简书 (jianshu.com) 对象关系映射&#xff08;ORM&#xff09;是将Java对象转换为数据库表的过程。换句话说&#xff0c;这允许我们在没有任何SQL的情况下与关系数据库进行交互。Java Persistence AP…

Redis入门(4)-list

redis中list数据会按照插入顺序进行排序&#xff0c;其底层是一个无头结点的双向链表&#xff0c;因此表头和表尾的操作性能较高&#xff0c;但中间元素操作性能较差。 1.lpush key element [element ] 从表头插入元素 lpush nosql redis hbase lpush nosql mongdb2.lrange…

信息熵、条件熵、信息增益

一、信息熵 其中&#xff1a; &#xff1a;样本属于第i个类别的概率 &#xff1a;总样本数 &#xff1a;集合 中属于第 个类别的样本个数 二、条件熵 其中&#xff1a; &#xff1a;属性 的取值个数 &#xff1a;选出属性 取值等于 的样本集合 三、信息增益 信息增…

安全防御 --- IPSec理论(03)

DPD 死亡对等体检测&#xff08;dead peer detection&#xff09;&#xff0c;检查对端IKE SA&#xff08;iskmp sa&#xff09;是否存在。当隧道出现异常&#xff0c;检测出异常重新发起协商&#xff0c;维持隧道。 作用&#xff1a;DPD解决隧道黑洞问题&#xff0c;用于检查…

Docker搭建Hadoop集群

目录 1.拉取centos镜像 2.基础镜像配置(基于centos构建hadoopbase镜像) 3.集群环境配置 1.创建3个容器 2.配置网络 3.配置主机和ip的映射关系 4.配置3个节点的免密登录 4.搭建hadoop集群 1.安装hadoop 2.修改配置文件 3.分发Hadoop及配置文件my_env.sh 5.启动集群 …

使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试

文章目录 1、环境准备2、CLion创建项目3、编写测试用例4、复杂测试用例 1、环境准备 注意版本匹配&#xff0c;我本地是g 8.1.0 的&#xff0c;最开始装了GoogleTest最新版1.10.0结果发现不能用&#xff0c;又回去下载旧的版本。g 8.1.0 应该可以使用 Google Test 1.8.1 版本。…

HLW8032交流电参数模块采样原理讲解

目录 一、文章概述 二、采样说明 1.采样方式 1.1隔离采样 电流型电压互感器&#xff1a; 1.2非隔离采样 2.采样范围 3.采样精度 三、数据说明 四、HLW8032模块说明 一、文章概述 本博文主要讲解HLW8032交流电参数模块的采样原理以及设计说明&#xff0c;才疏学浅&am…

微服务系列文章之 SpringCloud面试

1、什么是 Spring Cloud&#xff1f; Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。 2、使…

团体程序设计天梯赛-练习集L2篇⑦

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

奇异值分解MVDR算法功率谱估计MATLAB完整程序分享

clear ;close all;clc; 产生输入信号 N 1024; %样本点数 snr[20 25 30]; %信噪比 n0:N-1; %数据轴 g100; %蒙特卡诺仿真次数 M14; %阶数 Pmvdr_szeros(3,1024); %存放MVDR谱 signal1 exp(1i*0.1…

Oracle-DG备库应用查询不到数据问题处理

背景: 一套准备上线的Oracle 11G RAC主备集群&#xff0c;应用报告说部分模块测试发现在备库查不到新插入的数据&#xff0c;而且问题发生的频率很高&#xff0c;需确认主备之间同步是否存在问题&#xff0c;此套主备之间同步采用SYNCAFFIRM模式 问题分析: 接到问题之后&#…

2022(二等奖)C2464植物保护管理系统

作品介绍 一、需求分析 1. 应用背景 森林是陆地生态系统的主体&#xff0c;是人类生存与发展的物质基础。以森林为主要经营对象的林业&#xff0c;不仅承担着生态建设的主要任务&#xff0c;而且承担着提供多种林产品的重大使命。进入21世纪&#xff0c;人类正在继农业文明和…

libevent(12)bufferevent的基础知识

一、bufferevent的基本概念 bufferevent 是 libevent 中的一个事件缓冲 IO&#xff0c;内部实现了基本 socket recv/send 操作 &#xff0c;用户只需要调用 bufferevent 的 API 即可实现数据的读写。 &#xff08;1&#xff09;缓冲区&#xff1a;每个 bufferevent 都有一个读…

Effective第三版 中英 | 避免使用终结方法和清理方法

文章目录 Effective第三版前言避免使用终结方法和清理方法&#xff08;Avoid finalizers and cleaners&#xff09;总结 Effective第三版 前言 大家好&#xff0c;这里是 Rocky 编程日记 &#xff0c;喜欢后端架构及中间件源码&#xff0c;目前正在阅读 effective-java 书籍。…