系统编程-常用工具2

news2024/11/10 22:00:09

常用工具(2)

目录

常用工具(2)

一、gdb调试工具

如果想进行调试 编译程序的时候

二、makefile 脚本编译工具

1、makefile是什么?

2、使用makefile

-- 安装make指令

-- make指令的使用

-- Makefile文件的书写规则:

-- Makefile的运行规则:

-- 补充:


一、gdb调试工具

  --  一般所有集成环境都会自带调试工具

  • keil vscode qt 等都自带

-- gdb调试工具是linux系统自带的

如果想进行调试 编译程序的时候就:
  • gcc main.c -g
    -- 需要添加选项-g

  • 使用方法:gdb 可执行程序名
    -- 成功进入gdb调试工具 

    alt text


-- 调试的大概过程:1 添加断点 2 运行 3 调试

  • 断点:当程序运行到断点后会自动停止 -- gdb的一些指令:
  • l (L小写) 查看源文件内容 主要作用获取行号
    -- l 行号
    -- 一直输入l,就会一会向下显示程序,一个l不能完全显示程序。
    -- 主要作用是为了让你知道在哪加断点
    -- l 行号,可以直接跳转

    alt text

  • b 行号
    -- 在该行上添加一个断点
  • info b
    -- 查看断点信息
  • r       -- 从头开始运行程序
    -- 当程序遇到断点之后,不要在输入r了,如果输入r,就会重新从程序开头执行到该断点。

alt text

  • c 继续运行直到遇到下一个断点停止
  • s 遇到会进入到函数内部去运行
  • n 遇到函数会直接将函数运行完毕

  • -- 注:s和n都是一步一步执行的。c是运行到下一个断点。

alt text


-- print 变量名

  • 打印变量的值 

    alt text

-- clear 行号

  • 清除该行断点

    alt text

-- delete breakpoint 断点号 

alt text


  • disable b 断点号
    -- 失能断点

  • enable b 断点号
    -- 使能断点

alt text

 --q 退出

二、makefile 脚本编译工具

1、makefile是什么?

  • makefile是一个文件,里面包含了一系列的指令,通过makefile可以方便的编译程序,makefile文件一般以makefile或者Makefile命名。

2、使用makefile

-- 安装make指令
  • sudo apt-get install make

-- 如果出现错误,可以尝试一下命令:

  • sudo apt-get update

 

-- make指令的使用

-- make指令执行后,会去当前所在的路径主动查找有没有叫 makefile 的文件去运行

  • make 指令要想运行必须要有 Makefile 文件

  • -- 如果同一路径下有多个makefile文件 需要使用-f来指定运行哪一个,甚至文件名可以不是makefile
  •  

    alt text


 

-- Makefile文件的书写规则:

-- 目标:依赖文件
(Tab)指令

  • 语法规则
目标 ... : 依赖 ...
	命令1     # 命令前一定要用tab
	命令2
	. . .

-- 注:在makefile文件中写注释的符号是#

-- 目标就是指要干什么,或说运行 make 后生成什么,
而依赖是告诉 make 如何去做以实现目标。 在 Makefile 中,
目标和依赖是通过规则来表达的。

-- 规则

  • 目标的时间必须晚于依赖条件的时间,否则,更新目标。
  • 依赖条件如果不存在,找寻新的规则去产生依赖条件。

-- 变量的定义:

  • 变量名 = 变量值

-- 变量的使用:

  • $(变量名)

-- 特殊变量:

  • $@ 表示目标文件
  • $^ 表示所有的依赖文件
  • $< 表示第一个依赖文件

-- makefile 中通配符

  • % 百分号
  • !!!必须是目标和依赖文件一块进行通配
  • alt text


 

-- Makefile的运行规则:
  • 1、目标要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。
  • 2、默认情况下Makefile的第一个目标为终极目标。
  • 3、all:Makefile文件默认只生成第一个目标文件即完成编译,但是我们可以通过all 指定所需要生成的目标文件。
  • 4、依赖:即目标文件由哪些文件生成
  • 5、命令:即通过执行命令由依赖文件生成目标文件。
    -- 注意每条命令之前必须有一个tab(此文档编辑器默认是空格,复制下来的代码需要把命令代码的缩进改为tab制表符)保持缩进,这是语法要求(会有一些编辑工具默认tab为4个空格,会造成Makefile语法错误)。

  • 运行规则

alt text

alt text


 

-- 补充:

alt text


-- 1、"="是最普通的等号,在Makefile中容易搞错赋值等号,使用 “=”进行赋值,变量的值是整个Makefile中最后被指定的值。

VIR_A = A
VIR_B = $(VIR_A) B
VIR_A = AA

经过上面的赋值后,最后VIR_B的值是AA B,而不是A B,在make时,会把整个Makefile展开,来决定变量的值
  2、“:=” 表示直接赋值,赋予当前位置的值。

VIR_A := A
VIR_B := $(VIR_A) B
VIR_A := AA

最后BIR_B的值是A B,即根据当前位置进行赋值。因此相当于“=”,“:=”才是真正意义上的直接赋值
  3、“?=” 表示如果该变量没有被赋值,赋值予等号后面的值。

  •  VIR ?= new_value

如果VIR在之前没有被赋值,那么VIR的值就为new_value。

  • VIR := old_value
  • VIR ?= new_value

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

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

相关文章

面向新人的 Java 面试问题(51-100)

51. 使用 new() 创建 String 与创建文字有何不同&#xff1f; 使用 new() 的字符串与文字不同&#xff0c;因为当我们声明字符串时&#xff0c;它将元素存储在堆栈内存中&#xff0c;而当使用 new() 声明时&#xff0c;它会在堆内存中分配动态内存。即使存在相同内容的对象&am…

Xv6——物理分配器

对应文件&#xff1a;kalloc.c 物理内存布局 在Xv6中&#xff0c;物理内存大小是固定的&#xff0c;为128MB。物理内存起止也是固定的&#xff0c;由宏 KERNVASE 和 宏 PHYSTOP 定义。系统启动时&#xff0c;会把内核的代码加载到物理内存当中去&#xff1b;因此&#xff0c;可…

Android-自适用高度的ViewPager

需求 在项目中&#xff0c;我们常常遇到需要动态调整 ViewPager 的高度&#xff0c;以适应其内容大小的需求。默认情况下&#xff0c;ViewPager 的高度是固定的&#xff0c;无法根据每个页面的内容高度进行调整。这会导致在内容高度不一致时&#xff0c;出现不必要的空白区域或…

Cmake基础教程--第2章:打印信息和变量操作

Cmake基础教程--第2章&#xff1a;打印日志和变量操作 概述message打印日志打印一些CMake自带的信息 变量操作set操作list方法添加元素获取长度查找元素删除元素其他操作 概述 CMake项目时基于一个名为 CMakeLists.txt 的文件来构造的&#xff0c;注意大小写不能拼写错误。我们…

线程回收以及线程的问题处理

一、线程结束 1.1、pthread_exit 本身表示结束线程 如果用在main函数中 表示结束主线程 主线程结束并不表示进程 此时执行逻辑&#xff0c;主线程执行流结束&#xff0c;进程会在其余线程都结束后&#xff0c;结束 1.2、return 从线程中返回 线程执行函数执行结束&#x…

让回忆鲜活如初:13.3寸彩色墨水屏电子相框震撼上市

在这个数字化时代&#xff0c;我们习惯了在社交媒体上分享生活的点滴&#xff0c;但那些珍贵的记忆是否也能以更直观的方式呈现&#xff1f;近日&#xff0c;一款全新的13.3寸彩色墨水屏电子相框正式上市&#xff0c;它将以独特的方式让您的回忆鲜活如初。 高清彩色墨水屏&…

三维建模软件:地理信息与遥感领域的智慧构建者

在地理信息与遥感技术的广阔舞台中&#xff0c;建模软件如同一位卓越的建筑师&#xff0c;以数据为砖瓦&#xff0c;智慧为水泥&#xff0c;构建出一个又一个又一个逼真、动态的虚拟世界。本文将深入探究其技术核心、应用实例、未来趋势&#xff0c;揭示建模软件如何在地理信息…

论文干货|AI一键生成论文的AI工具!附使用攻略!速速码住!

在当前的学术研究和写作环境中&#xff0c;AI技术的应用已经变得越来越普遍。特别是在论文写作方面&#xff0c;许多学生和研究人员都在寻找能够提高效率、简化流程的工具。千笔-AIPassPaPer是一款备受推荐的AI论文生成工具&#xff0c;它不仅功能全面&#xff0c;而且用户体验…

Windows、Ubuntu安装mysql

今天我们来学习一下如何在Windows、Ubuntu安装mysql。 Windows安装mysql 第一步&#xff1a;在官网找到需要安装的mysql版本&#xff0c;下载 第二步&#xff1a;下载后打开安装包&#xff0c;进行安装。 点击 “Next”: 默认就行&#xff0c;单击next: 单击“Excute” 等…

Postgresql导入矢量数据

前期准备 工具&#xff1a;PgAdmin&#xff0c;postgis-bundle Postgres安装和postgis安装可以百度别的教程。 创建数据库添加扩展 如图&#xff0c;使用PgAdmin创建名为shp的数据库&#xff0c;并在扩展item中添加postgis扩展。 添加扩展方法可以用查询工具输入以下sql语句&…

贪吃蛇(C语言详解)

贪吃蛇游戏运行画面-CSDN直播 目录 贪吃蛇游戏运行画面-CSDN直播 1. 实验目标 2. Win32 API介绍 2.1 Win32 API 2.2 控制台程序&#xff08;Console&#xff09; 2.3 控制台屏幕上的坐标COORD 2.4 GetStdHandle 2.5 GetConsoleCursorlnfo 2.5.1 CONSOLE_CURSOR_INFO …

免费通配符泛域名SSL证书全自动申请、更新、续期、部署,支持部署到阿里云、腾讯云、ssh主机

CertD&#xff1a;全自动SSL证书管理平台 CertD是一款创新性的开源工具&#xff0c;专注于提供免费且全自动化的SSL证书申请及更新服务。它的命名灵感来源于Linux守护进程的命名方式&#xff0c;“D”代表证书守护进程&#xff08;Certificate Daemon&#xff09;&#xff0c;…

SpringBoot-读取配置文件内容

目录 前言 主页&#xff08;端口号默认8080&#xff09; 1 Value 注解 引用变量的使用 2 Environment 对象 3 ConfigurationProperties &#xff08;配置内容和对象&#xff0c;进行相互绑定&#xff09; 前言 读取配置文件有3 种方式 (1) Value注解 (2) Environm…

基于springboot的网上服装商城

TOC springboot182基于springboot的网上服装商城 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性…

C++竞赛初阶L1-11-第五单元-for循环(25~26课)514: T454425 奥运奖牌计数

题目内容 2008 年北京奥运会&#xff0c;A 国的运动员参与了 n 天的决赛项目 (1≤n≤100)。现在要统计一下 A 国所获得的金、银、铜牌数目及总奖牌数。输入第 1 行是 A 国参与决赛项目的天数 n&#xff0c;其后 n 行&#xff0c;每一行是该国某一天获得的金、银、铜牌数目&…

C++ stack与queue的使用与简单实现

目录 0. 适配器 1. stack的简要介绍 2. stack的简单使用 3. queue的简要介绍 4. queue的简单使用 STL标准库中stack和queue的底层结构 deque简单介绍 5. stack的模拟实现 6. queue的模拟实现 0. 适配器 在文章开始前我们先了解一下适配器的概念 适配器是一种设计模式(设计…

【第二节】80x86汇编-寄存器和标志位

目录 前言 一、汇编相关概念 1.1 数据表示与类型 1.2 汇编语言的构成 1.3 存储器及指令、数据 1.4 存储单元 1.5 CPU对存储器的读写操作 1.6 CPU读写内存单元的过程 1.7 intel CPU发展 1.8 8086 内部结构 二、寄存器 2.1 寄存器概览 2.2 32位寄存器 2.3 16位寄存器…

浅谈C语言预处理

文章目录 预处理1、预定义符号2、#define定义标识符和宏A、#define定义标识符B、#define定义宏a、宏的定义b、宏的使用c、宏和函数 3、条件编译4、头文件包含A、两种包含形式B、防止头文件被重复包含 预处理 什么是预处理&#xff1f;预处理是C语言编译的三个过程&#xff08;…

一口气把halcon的所有运算符说清楚

halcon的运算符大体分以下几类 一&#xff1a;赋值运算符&#xff1a; (1) 赋值(:)&#xff08;左边的赋值给右边&#xff09; 二&#xff1a;算术运算符 (1)加()、减(-)、乘(*)、除(/)、求余(%) 三&#xff1a;关系运算符 (3)#、&#xff01; 不等于 四&#xff1a;逻辑运…

java中运算符的详细知识点

算数运算符 a 先赋值再加1 a 先加1在赋值 --的道理是一样的 赋值运算符 1. - * / % 当两侧数据类型不一致时&#xff0c;可以使用自动类型转换或使用 强制类型转换原则 支持连续赋值 - * / % 不会改变基础类型 测试一下&#xff1a; 比较运算符 运算结果为布尔类型 &#x…