linux关于cmake,makefile和gdb的使用

c文件的编译

安装环境(centos 7)

检查命令是否齐全

gcc --version
g++ --version
gdb–version

安装命令

yum -y install gcc-c++安装g++命令(用于编译c/c++文件)
yum -y install gcc安装gcc命令(用于编译c文件)
在这里插入图片描述
每个都出现版本号,证明已经安装成功

直接生成可执行文件

gcc 文件名 -o 生成文件名
在这里插入图片描述
一定要将命令写对,命令参数的顺序写对

预处理

g++ -E 源文件名 生成文件名.i
1.将头文件展开
2.宏替换
3.内联函数替换
4.注释省略
5.进行条件编译,#ifdef,#ifndef,#endif 等
6.生成.i文件
在这里插入图片描述

在这里插入图片描述

编译

g++ -s 生成文件名.i -o 生成文件名.s
1.汇总函数符号生成符号表
在这里插入图片描述

2.扫描,语法分析,语义分析,源代码分析,目标代码生成,目标代码优化
3.生成.s文件

汇编

g++ -c 生成文件名.s -o 生成文件名.o
1.转为二进制
2.虽然汇编是转成二进制,但是也会进行相应的检查,如果有函数只定义如果没有实现就会在这里发生报错
在这里插入图片描述
3.生成.o文件

链接

g++ -o 可执行文件名 -o 生成文件名.o
1.将各个文件进行链接,符号表进行对应,查找各个函数的地址,生成可执行文件
2.静态链接和动态链接
如果代码没有错误,最后会成功生成可执行文件
在这里插入图片描述
ldd 可执行文件名查看文件的链接情况

windowslinux
动态链接.dll.so
静态链接.lib.a

在这里插入图片描述

makefile

1.写入makefile文件

mybin:main.c
	gcc -g main.c -o mybin
	
	# 两者是等价的
	# gcc -o $@ $^
	# gcc -o mybin main.c 

.PHONY:clean
clean:
	rm -r mybin

在这里插入图片描述
2.使用make生成文件
make命令的时间对比是和上次修改的时间做对比,如果从上次make之后没有修改就不用生成新的(前提是make命令后生成的文件存在的情况下,如果不存在也是要重新生成的)
在这里插入图片描述
3.使用make clean进行文件的删除
在这里插入图片描述

gdb调试工具

gdb的安装
gdb的启动

1.使用-g添加可调式权限
gcc -g 源文件名 -o 生成可执行文件名
2.gdb 可执行文件名进入调试界面
在这里插入图片描述

gdb调试命令

1.l [数字]没有数字就从main开始,有数字就从头开始
在这里插入图片描述
有人说我为什么只有这么点儿代码,我的代码被吃了吗?
确实和我们想的不一样
我们只需要按回车,他就能把代码全部显出来,直到最后
在这里插入图片描述
2.r直接运行程序
在这里插入图片描述
3.b [行号]在指定行打断点
在这里插入图片描述
运行到断点处会停下来
如果我写一个死循环,会发生什么
在这里插入图片描述
他不会停下来
在这里插入图片描述

强制退出还是在gdb中,并且会显示从哪里跳出来的
在这里插入图片描述
info b查看断点
d [断点编号]只能通过断点编号才能将断点进行删除
在这里插入图片描述
n逐过程
s逐语句(进入函数)
逐过程
在这里插入图片描述
逐语句
在这里插入图片描述
在这里插入图片描述
disable/enable停用断点/启用断点
在这里插入图片描述

在21行添加的断点,运行,强制停止运行的时候,从26行跳出,证明21行的断点已经停用

运行,启用断点,逐过程,到达23行,证明断点启用成功
在这里插入图片描述
c跳到下一个断点的位置
在这里插入图片描述

finish运行完一个函数
在这里插入图片描述

在21行停下来,逐语句执行,进入函数到13行,然后finish命令直接跳到函数结束,证明是将函数执行完

bt调用堆栈
在这里插入图片描述

进入21行函数,调用堆栈,可以看见两个函数

display 变量名,取地址常显示监视变量
undisplay [变量编号]取消常显示
在这里插入图片描述

常数2也是可以进行监视的,并且需要取消监视的时候,可以连续取消多个监视

until 行号直接跳到某一行

如果中间有断点还是要停下来的
在这里插入图片描述

从第17行直接跳到23行
在这里插入图片描述
set var 变量名=value强制改变某个变量的值进行调试
在这里插入图片描述

批量化注释和取消

1.注释
ctrl+v选中要注释的列
shift+i
//
ESC
在这里插入图片描述

2.取消注释
ctrl+v选中需要注释的列
使用方向键进行选择需要取消注释的列(hjkl–左,下,上,右)或者使用方向键
d
在这里插入图片描述

查找命令

1.查找文件
find 路径 -name 文件名
2.查找命令
which 命令(ls,pwd,cd)
3.查找安装的文档,压缩包,头文件
whereis 头文件/压缩包/下载的文档

给用户分配权限

vim /etc/sudoers
在这里插入图片描述
这里原本(文档的100行左右)是没有user1的,我们按照上root写的形式抄下来,将名称给改成需要分配权限的用户

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

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

相关文章

Java-接口和抽象类

本章重点:1. 抽象类 2. 接口 3.Object类 1. 抽象类 1.1 抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一…

计算机毕业设计项目选题推荐(免费领源码)java+mysql二手校园交易平台67613

目录 摘要 1 绪论 1.1 研究背景 1.2国内外研究现状 1.3论文结构与章节安排 2 二手校园交易平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 …

滚雪球学Java(09-2):Java中的关系运算符,你真的掌握了吗?

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

3.6 Windows驱动开发:内核进程汇编与反汇编

在笔者上一篇文章《内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写…

C语言每日一题(31)相交链表

力扣160.相交链表 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意…

主办方:上海视频媒体,多样式多渠道跨屏传播

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 一,邀请视频媒体参加活动发布会,好处多多,首先现场气氛会很热烈,主办方会很有面子,视频媒体不管是电视台还是视频网站&#xf…

【自留地】前端 - uniapp - Vue - React - Flutter

uniapp uniapp自用速查表 - 我的常用组件 uniapp自用速查表 - 我的常用组件_uniapp static/customicons.css-CSDN博客文章浏览阅读1.8k次。uniapp项目登录退出、全局变量与状态、本地存储、Tabbar标签栏、顶部导航栏、下拉刷新、触底刷新、Ajax交互、内置组件样式修改、自定义…

聚观早报 |联想集团Q2财季业绩;小鹏汽车Q3营收

【聚观365】11月17日消息 联想集团Q2财季业绩 小鹏汽车Q3营收 微软发布两款自研AI芯片 FAA批准SpaceX再次发射星际飞船 2023 OPPO开发者大会 联想集团Q2财季业绩 全球数字经济领导企业联想集团公布截至2023年9月30日的2023/24财年第二财季业绩:整体营收达到10…

C++基础从0到1入门编程(一)

系统学习C 方便自己日后复习,错误的地方希望积极指正 参考视频:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 1 第一个C程序-HelloWorld 编写一个C程序分为四个步骤: (1)创建项目 (2&#xff…

深度学习入门(第四天)——递归神经网络与词向量原理解读

一、RNN网络架构解读 常规神经网络并不能考虑时间序列的特征(比如前天昨天今天或者带有前后关联的特征),现在每个特征都是独立考虑的,那么如果有这样的特征,网络应该怎么学呢 而递归递归网络hidden这里的转回箭头&…

全球地表水数据集JRC Global Surface Water Mapping Layers, v1.2数据

简介: 全球地表水覆盖(Global Surface Water)是利用1984至2019年获取的landsat5、landsat7和landsat8的卫星影像,生成分辨率为30米的一套全球地表水覆盖的地图集。用户可以在全球尺度上按地区回溯某个时间上地表水分的变化情况。…

MySQL内部组件与日志详解

MySQL的内部组件结构 MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等)&am…

Android开发APP显示头部Bar

Android开发显示头部Bar 需求&#xff1a; 显示如下图&#xff1a; 显示头部Bar&#xff0c;颜色也能自定义。 解决方案 这个修改是在如下三个文件里进行修改&#xff1a; 按顺序修改&#xff1a; themes.xml(night): <resources xmlns:tools"http://schemas.andr…

21 - 深入JVM即时编译器JIT,优化Java编译

说到编译&#xff0c;我猜你一定会想到 .java 文件被编译成 .class 文件的过程&#xff0c;这个编译我们一般称为前端编译。Java 的编译和运行过程非常复杂&#xff0c;除了前端编译&#xff0c;还有运行时编译。由于机器无法直接运行 Java 生成的字节码&#xff0c;所以在运行…

Odoo 15开发手册第六章 模型 - 结构化应用数据

本章我们更进一步学习模型层&#xff0c;以及如何使用模型来设计支撑应用的数据结构。我们会探讨可用的模型类型&#xff0c;以及在使用这些类型时如何定义强制进行数据验证的约束。 模型由支持不同数据类型的数据字段组成&#xff0c;一些字段类型支持定义模型间的关联。对于…

excel导入 Easy Excel

依旧是框架感觉有东西&#xff0c;但是确实是模拟不出来&#xff0c;各种零零散散的件太多了 controller层 ApiOperation(value "导入Excel", notes "导入Excel", httpMethod "POST", response ExcelResponseDTO.class)ApiImplicitParams({…

回调方法Callbak方法的理解——Java中回调的实现方式 从系统调用角度理解回调

目录 回调方法实现用反射实现直接调用callback进化&#xff1a;接口实现分离 匿名内部类 到 函数式编程 从系统调用角度理解回调同步调用异步调用不需要对方结果需要对方的结果 菜鸡问大佬问题案例同步回调异步回调基于Future的半同步 回调方法就是一个参数,将一个A方法作为参数…

Power Automate-创建自定义连接器

点击左侧导航栏&#xff0c;更多&#xff0c;点击全部发现 点击下方的自定义连接器 点击从空白创建 注意命名要用英文 常规信息中可以上传连接器icon、写一些说明 方案是观察接口地址前面的文本&#xff0c;主机是下方接口地址中蓝色框中的内容 点击下一步&#xff0c;根据API自…

CTF-PWN-堆-【前置知识】

CTF-PWN-堆 堆申请堆块main_areanabrk&sbrk函数mallocfreefree后top chunk 堆 由malloc alloc realloc 函数分配 chunk的前指的是地址低的&#xff0c;chunk的高指的是地址高的 申请堆块 ptmalloc2堆管理器&#xff1a; 通俗的讲就是相当于一个”中间商”&#xff0c;在…

Python编程技巧 – 使用列表(list)

Python编程技巧 – 使用列表(list) Python Programming Skills – Using a List 在Python编程语言中&#xff0c;我们会用到许多列表&#xff08;List&#xff09;。 一门强大的编程语言会包含列表&#xff08;或者数组&#xff09;的数据结构。列表&#xff08;或数组&#…
最新文章