Makefile及gdb的使用方法介绍

  • makefile网址:跟我一起写Makefile — 跟我一起写Makefile 1.0 文档

    • 本质

      • 是一个工程管理文件

      • 作用

        • 简化编译流程

    • 理论基础

      • gcc 分步编译(4步)

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

      • makefile

        • 将.c文件生成二进制文件.o(汇编)

        • 使用.o文件完成最后的链接过程

    • 文件的作用

      • 简化了编译流程,不需要将全部源文件重新编译

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

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

    • make工具

      • 读取make文件

        • 默认执行第一个目标

          • 只写一条规则,会自动推导前面的运行过程

        • 当目录下有Makefile和makefile 两个文件时,默认读取小写字母开头的文件

        • make的标准使用格式:

          • make 目标

          • 直接运行Makefile中指定目标的那条规则

        • make -f 指定文件

          • make -f 文件名 目标名

          • 不读入默认文件,读入指定文件的指定目标

      • makefile文件是make工具的唯一读入文件

    • Makefile文件的书写

      • 由规则,变量,条件编译及函数构成

    • 规则的构成

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

        • 目标:依赖 <Tab>编译指令

          • 一般指令是依赖生成目标的过程

          • 指令前不是Tab键而是四个空格则会报错

      • 一条规则中一定要有一个目标,一条规则中可以有多个依赖

      • 一条规则可以没有依赖,只执行某些指令

      • 一条规则可以没有指令,只描述目标和依赖之间的关系

    • 第一版Makefile

      • all:fun fun.o:fun.c gcc -c fun.c -o fun.o fun:fun.o main.o gcc fun.o main.o -o fun main.o:main.c gcc -c main.c -o main.o clean: rm *.o fun

        • 如果依赖的时间戳比目标的时间戳更新,目标会重新生成

        • 只写一条规则,Makefile会进行自动推导(Makefile在每次运行前,会自动生成文件依赖树)

    • make中的变量

      • 变量赋值

        • =

          • 递归赋值

            • 变量名 = 变量的值 (Makefile中赋值运算符两侧可以有空格也可以没有空格)

            • 获取变量的值为其最后一次赋值的结果

              • 调用时不管是在最后一次赋值前还是后

        • :=

          • 立即赋值

            • 赋值为当前值

        • +=

          • 追加赋值

            • 连续赋值多次,且不覆盖

              • 将这一次的值添加在之前值的后面,并用空格隔开

        • ?=

          • 条件赋值

            • 只能被赋值一次,相当于常量,不可修改

        • 使用变量的值:${}、$()、$

          • 推荐使用$()和shell脚本做区分

    • 第二版Makefile

      • 引入变量

        • EXE=fun

          • 保存可执行文件

        • OBJs+=fun.o

        • OBJs+=main.o

        • CC=gcc

          • Makefile中表示使用的编译器的自动变量

        • CFLAGS=-c -o

          • 保存编译参数

      • EXE=FUN OBJs+= fun.o OBJs+=main.o CC=gcc CFLAGS=-c -o all:$(EXE) $(EXE):$(OBJs) $(CC) $(OBJs) -o $(EXE) fun.o:fun.c $(CC) $(CFLAGS) -c -o fun.o fun.c main.o:main.c $(CC) $(CFLAGS) -c -o main.o main.c clean: rm $(OBJs) $(EXE)

      • 引入自动变量和通配符

        • 自动变量

          • $@:所有的目标

          • $^:所有的依赖

          • $<:第一个依赖

            • 针对于一条规则而言的, 不是针对整个Makefile文件

        • EXE=FUN OBJs+= fun.o OBJs+=main.o CC=gcc CFLAGS=-c -o all:$(EXE) $(EXE):$(OBJs) $(CC) $^ -o $@ %.o:%.c $(CC) $(CFLAGS) $@ $^ clean: rm $(OBJs) $(EXE)

    • 第三版Makefile

      • 引入通配符:

        • *:通配所有情况

        • %:是一种(字符串的)模式匹配,在Makefile中的作用是,有一个.o,就匹配一个同名的.c

        • %.o:%c

          • 从上一条规则中,获取到需要两个.o文件,fun.o和main.o,使用%进行模式匹配,

          • %匹配相同的部分,有一个fun.o就能匹配到一个fun.c,有一个main.o就能匹配到一个main.c

      • EXE=FUN OBJs+= fun.o OBJs+=main.o CC=gcc CFLAGS=-c -o all:$(EXE) $(EXE):$(OBJs) $(CC) $^ -o $@ fun.o:fun.c $(CC) $(CFLAGS) $@ $^ main.o:main.c $(CC) $(CFLAGS) $@ $^ clean: rm $(OBJs) $(EXE)

    • 伪目标

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

      • clean

        • 直接将目标定义为伪目标 .PHONY : clean 将clean定义为伪目标

      • 伪目标的作用

        • 不会检查时间戳,直接执行规则中的内容

    • 引入函数

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

      • wildcard

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

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

        • $(wildcard *.c)

          • 找到当前路径下,所有.c文件的文件名

      • patsubst

        • 模式匹配替换字符串

        • $(patsubst 源格式,目标格式,要替换的字符串)

        • $(patsubst %.c,%.o,1.c 2.c)

          • 获取到1.c和2.c字符串,根据模式匹配,得到1.o和2.o中字符串

        • 每一个参数之间以逗号作为分隔,要替换的字符串之间以空格作为分隔

    • 第四版Makefile

      • 引入内置函数

      • EXE=fun #保存可执行文件 FILES=$(wildcard *.c) #保存了所有.c文件的文件名 OBJs=$(patsubst %.c,%.o,$(FILES)) #使用patsubst将所有的.c字符串替换成.o字符串 CC=gcc #Makefile中表示使用的编译器的自动变量 CFLAGS=-c -o #保存编译参数 all:$(EXE) $(EXE):$(OBJs) $(CC) $^ -o $@ %.o:%.c $(CC) $(CFLAGS) $@ $^ .PHONY:clean #将clean定义为伪目标 clean: @rm $(OBJs) $(EXE) #@取消指令的回显

    • gdb调试工具

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

      • gdp调试流程

        • 生成可以使用gdb调试的可执行文件

          • gcc -g xxx.c

          • 生成的a.out文件可以使用gdb调试

        • 进入gdb工具

          • gdb 可执行文件名

            • 使用gdb工具开始调试可执行文件

        • 查看源文件内容

          • l(list):查看.c文件的前10行,如果代码超出10行,再输入l

        • 工具指令

          • b 行号

            • 在指定行数打断点

          • r

            • 让程序运行,会停在断点处

          • n

            • 让程序向下执行一步 (如果碰到函数,不能进入函数内部)

          • s

            • 让程序向下执行一步 (如果碰到函数,可以进入函数内部,继续执行)

          • p 变量名

            • 打印变量的值

          • q

            • quit退出gdb工具

      • 调试core文件

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

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

        • ulimit -a 查看文件的权限

          • help ulimit

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

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

          • 若上面的指令不能执行,则执行以下指令

          • sudo bash -c "echo core > /proc/sys/kernel/core_pattern"

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

          • gdb a.out core

          • 程序会停在发生错误的一行

      • 调试正在运行的程序

        • 需要在后台终端运行可执行文件

        • ./a.out &

          • 会终端回显进程号

          • ps -ajx | grep a.out

            • 查找指定进程的进程号

        • gdb -p 进程号

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文带你了解什么是【点击劫持】

点击劫持&#xff0c;意思就是你点击网页的时候&#xff0c;有人劫持你&#xff0c;对没错&#xff0c;劫持你的信息&#xff0c;甚至劫持你的马内&#xff0c;劫持你的理想&#xff0c;劫持你的肉体&#xff0c;劫持你的灵魂。就是这么可怕。 目录 1 如何实现假网站 1.1 if…

Spring Cloud Consul作为配置中心实践

官网地址&#xff1a;https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-config Consul 提供了一个键/值存储用于保存配置和其他元数据。Spring Cloud Consul Config 是 Spring Cloud Config Server和Client的一个替代方案。配置…

从零到一打造自己的大模型:模型训练

前言 最近看了很多大模型&#xff0c;也使用了很多大模型。对于大模型理论似乎很了解&#xff0c;但是好像又缺点什么&#xff0c;思来想去决定自己动手实现一个 toy 级别的模型&#xff0c;在实践中加深对大语言模型的理解。 在这个系列的文章中&#xff0c;我将通过亲手实践…

Hadoop3.3.4 + HDFS Router-Based Federation配置

一、HDFS Router-based Federation 官方文档见&#xff1a; Apache Hadoop 3.4.0 – HDFS Router-based Federationhttps://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs-rbf/HDFSRouterFederation.html 二、集群规划 本次测试采用6台虚拟机创建了2套HDF…

Linux高并发服务器开发(四)进程间通信

文章目录 1 前言2 无名管道3 有名管道4 管道读写特点5 设置管道为非阻塞6 使用有名管道实现简单版本聊天7 共享存储映射7.1 mmap 存储映射函数7.2 共享映射实现父子进程通信7.3 共享映射实现无亲缘关系进程通信7.4 匿名映射实现父子进程通信 8 信号8.1 概念和特点8.2 信号的编号…

通用后台管理系统(一)——项目介绍

目录 二、文档结构 src文件夹&#xff1a; 三、技术和插件 1、Vue router 2、element-ui框架 3、样式插件less 4、vuex状态管理 5、axios.js 6、mock.js模拟数据 7、echarts图表工具 四、项目效果展示 总结 一、项目介绍 通用后台管理是采用vue2cli开发的项目&#…

国行版苹果Vision Pro即将发售 高昂定价吓退普通消费者?

2024年2月2日&#xff0c;苹果第一代空间计算设备Vision Pro在美国上市。6月28日&#xff0c;国行版苹果Vision Pro也将正式发售&#xff0c;别为256GB版29999元、512GB版31499元、1TB版32999元。不过从此前Vision Pro预售情况来看&#xff0c;Vision Pro的“杀手锏”在“价格”…

Arduino - 继电器

Arduino - 继电器 In a previous tutorial, we have learned how to turn on/off an LED. In this tutorial, we are going to learn how to turn on/off some kind of devices that use the high voltage power supply(such as a light bulb, fan, electromagnetic lock, lin…

# Kafka_深入探秘者(8):kafka 高级应用

Kafka_深入探秘者&#xff08;8&#xff09;&#xff1a;kafka 高级应用 一、kafka 消费组管理 1、kafka 命令行工具 参考官网: http://kafka.apache.org/22/documentation.html 2、kafka 消费组管理&#xff1a;查看消费组 # 切换到 kafka 安装目录 cd /usr/local/kafka/…

WIFI7技术之多重资源单元(Multi-RU)技术

什么是WIFI7及Multi-RU技术&#xff1f; 随着无线通信技术的不断进步&#xff0c;WiFi技术也在不断演变。WIFI7&#xff0c;即IEEE 802.11be&#xff0c;是下一代无线网络标准。它旨在提供更高的带宽、更低的延迟和更好的用户体验。WIFI7引入了许多新特性&#xff0c;其中之一…

PostgreSQL 连接器:在 SeaTunnel 中的应用与优势

在现代企业中&#xff0c;数据已经成为核心资产&#xff0c;基于开源数据集成平台SeaTunnel&#xff0c;工程师如何高效地连接和管理这些数据源&#xff0c;直接关系到企业的竞争力和运营效率。 本文将给大家介绍如何通过 JDBC PostgreSQL 数据源连接器&#xff0c;在 SeaTunne…

使用Flink CDC实时监控MySQL数据库变更

在现代数据架构中&#xff0c;实时数据处理变得越来越重要。Flink CDC&#xff08;Change Data Capture&#xff09;是一种强大的工具&#xff0c;可以帮助我们实时捕获数据库的变更&#xff0c;并进行处理。本文将介绍如何使用Flink CDC从MySQL数据库中读取变更数据&#xff0…

Docker部署常见应用之Oracle数据库

文章目录 安装部署参考文章 安装部署 使用Docker安装Oracle数据库是一个相对简便的过程&#xff0c;可以避免在本地环境中直接安装Oracle数据库的复杂性。 安装Docker环境&#xff1a;确保你的系统上已经安装了Docker&#xff0c;并且Docker服务正在运行。具体的安装方法可以根…

TikTok网页版使用指南:如何登录TikTok网页版?

海外版抖音TikTok&#xff0c;已成为连接全球观众的重要平台。据统计&#xff0c;在美国&#xff0c;TikTok的用户数量已达到近1.3亿&#xff0c;并且在国外的95后用户群体中很受欢迎。 TikTok网页版也提供了一个广阔的平台&#xff0c;让品牌和创作者在电脑端与全球观众互动&…

数据结构与算法基础(王卓)--学习笔记

1 数据结构分类 1.1 逻辑结构分类 集合结构线性结构&#xff1a;线性表、栈、队列、串树形结构图形结构 1.2 物理结构分类 逻辑结构在计算机中的真正表示方式&#xff08;又称为映射&#xff09;称为物理结构&#xff0c;也可叫做存储结构 顺序存储结构&#xff1a;数组链…

【Unity】Excel配置工具

1、功能介绍 通过Excel表配置表数据&#xff0c;一键生成对应Excel配置表的数据结构类、数据容器类、已经二进制数据文件&#xff0c;加载二进制数据文件获取所有表数据 需要使用Excel读取的dll包 2、关键代码 2.1 ExcelTool类 实现一键生成Excel配置表的数据结构类、数据…

Centos7源码方式安装sqle及开发相关

官方文档-源码安装 操作系统&#xff1a;centos:7.9,everything (DVD版应该也可以) (在ubuntu22.04装了两天之后乖乖开了一个新Centos7虚拟机) 镜像&#xff1a;清华大学开源软件镜像站 centos/7.9.2009 安装git sudo yum update -y sudo yum install -y git git --version安…

Sonia索尼娅:填补心理健康护理缺口的创新人工智能治疗师应用APP

聊天机器人可以取代人类治疗师吗&#xff1f;一些初创公司和患者声称他们可以。但这并不是完全确定的科学。 一项引人注目的研究发现&#xff0c;高达80%的使用OpenAI的ChatGPT寻求心理健康建议的人认为&#xff0c;这项技术可作为传统治疗的理想替代方案。与此同时&#xff0…

Android高级面试_2_IPC相关

Android 高级面试-3&#xff1a;语言相关 1、Java 相关 1.1 缓存相关 问题&#xff1a;LruCache 的原理&#xff1f; 问题&#xff1a;DiskLruCache 的原理&#xff1f; LruCache 用来实现基于内存的缓存&#xff0c;LRU 就是最近最少使用的意思&#xff0c;LruCache 基于L…

国外8年联培访学迎来逆袭|国家最高科学技术奖薛其坤成长史

国家最高科技奖花落薛其坤&#xff0c;他是该奖项史上最年轻得主。在追踪其成长史的过程中&#xff0c;知识人网小编注意到&#xff1a;薛其坤的学习研究开局并不顺利&#xff0c;直至到日本做联合培养博士研究生&#xff0c;他才真正迎来了自己学术生涯的重要转折点。后来到美…