Linux~一些基本开发工具的使用(yum,vim,gcc,gdb,makefile)

news2024/10/6 5:58:46

目录

一.yum——安装软件

二.Vim——文本编辑器

(1).命令模式

(2).底行模式

(3).插入模式

tips:给对应用户配置sudo命令 

一些注意事项

三.gcc/g++——编译器

(1).gcc如何完成翻译的四个过程

记忆方法/-o选项的使用

四.gdb——调试器

Q:为什么要加-g才能调试

常用选项

五.make/Makefile——自动化构建工具

(1).概念

(2).使用

添加依赖关系/依赖方法

添加清理功能

Q:.PHONY有什么用

(3).原理


一.yum——安装软件

        yum就类似手机上的应用市场,一些特定的组织或者个人把Linux下相关的软件都放在了一个特定的服务器上,yum会自动在特定的服务器上找到对应的服务,并下载下来,同时yum还会把当前服务所需要的其他服务(软件/依赖关系)都下载到你的主机上。

yum list:查看可以安装的软件

yum install:安装软件

yum remove:删除软件


二.Vim——文本编辑器

(1).命令模式

光标相关:

  • h(左)j(下)k(上)l(右)
  • shitf+^(行首)
  •  shift+$(行尾)
  • gg(起始行,第一行)
  • shift+g(结束行,最后一行)
  • n+shift+g(指定行)

  • b/w:按照单词为单位进行前后光标移动

补充:

  • 批量注释方法:crtl v 用jk选中区域,再按大写I,然后//,再按esc
  • crtl v jk 选中区域,d,就删除了注释
  • ! man fork:在不退出Vim的情况下查看man手册
  • ! make:不退出Vim的情况下编译程序
  • !./生成的程序名:在不退出Vim的情况下运行程序

文本操作:

  • yy:复制当前行
  • nyy:复制当前行及其之后的n行,包含当前行
  • p:粘贴复制的内容(可以复制多行)(复制一行以后可以粘贴10000行,vs下让你复制10000行????)
  • np:一次重复粘贴n倍复制的行(如果复制了5行,3p就是粘贴3倍复制的内容,一共15行)
  • dd:删除当前光标所在行,支持ndd
  • dd之后再p:剪切功能(dd实际上就是删除并复制,dd后再p就像是剪切

  • x:左向右删除光标所在的字符,支持nx
  • X:右向左删除,删除光标所在位置之前的字符(就和backspace一样),也是支持nX
  • r:替换一个字符,光标所在的字符,支持nr
  • shift+r:替换模式,直接进行多个内容的替换
  • u:撤销误操作
  • ctrl+r:撤销最近的撤销

  • shift+~:快速大小写切换

(2).底行模式

  • set nu:调出行号
  • set nonu:取消行号

  • vs 文件:打开另一个文件,分屏进行多文件操作 [ctrl+w+w可以让光标在屏幕之间跳转]
    • 可以在一个文件中复制,然后光标切换到另一个文件粘贴
    • 光标在哪里,按:就会进入哪个文件的底行模式,可以退出那个文件

  • w:保存
  • q:退出
  • ! :强制 [w ! , q!, wq! ]注意顺序

(3).插入模式

i,a,o都可以进入插入模式

  • i光标位置不变
  • a光标位置向后移动一个
  • o光标位置新加一个空行,然后光标到这个空行

tips:给对应用户配置sudo命令 

[root@VM-8-12-centos ~]# vim /etc/sudoers

在root用户下输入指令 vim /etc/sudoers,修改sudoers文件中

## Allow root to run any commands anywhere 

这一行下面的内容,将需要加入sudo命令的用户加入这里即可。


一些注意事项

1.在插入模式下,Linux中的光标是覆盖在字符上面的,此时backspace删除和插入字符是作用在当前光标之前的。

2.Vim卡死,这并不是Linux死机,或者vim卡住,而只是按了Ctrl + s后,vim停止向终端输出。解决方法:退出这种状态,按下Ctrl + q

3.一般情况下,底行模式和插入模式之前必须经过命令模式,不能直接切换

  1. 底行模式->插入模式, 按esc到命令模式,按i/a/o到插入模式
  2. 插入模式->底行模式, 按esc到命令模式,按:到底行模式

无论当前处于什么模式,esc一定可以回到命令模式


三.gcc/g++——编译器

(1).gcc如何完成翻译的四个过程

1.gcc不带选项编译文件,默认生成的文件名是a.out,再编译,还是a.out

1. 预处理(进行宏替换)

2. 编译(生成汇编)

3. 汇编(生成机器可识别代码)

4. 链接(生成可执行文件或库文件)

这四个步骤可以叫做是翻译

1.gcc -E mytest.c -o mytest.i,将源文件进行预处理,完成以后生成mytest.i文件(预编译文件)(预处理后的文件我们一般命名为.i,注意这里需要指明文件名)

  • 处理的作用---头文件展开,去掉注释,条件编译,宏替换

2.gcc -S mytest.i -o mytest.s,将预处理后的.i文件进行编译,完成以后生成mytest.s文件(汇编文件)(这里不-o指定文件名也可以,但是为了和前面的-E统一,还是指定一下)

  • 编译的作用---将预处理后的文件(C语言)变成汇编文件(汇编语言)

3.gcc -c mytest.s -o mytest.o ,将编译以后的汇编文件,也就是.s文件,进行汇编操作,完成以后生成mytest.o文件(可重定向的目标文件,一个二进制文件,在windows下就是mytest.obj)

  • 汇编的作用---将汇编文件转化成可重定向的目标文件,变成一个二进制文件(计算机不能直接执行汇编文件,汇编语言也有编译器)

注:生成的这个二进制文件我们还是无法执行

我们可以使用od命令查看二进制文件,让它以八进制或者十六进制的形式显示

od hello.o

4.gcc mytest.o -o mytest ,将汇编以后的目标文件生成可执行文件mytest(这里不加后缀名也可以)

  • 链接的作用---将代码中的函数调用,外部数据(比如一定义在库里面的变量)与各种库关联起来(你调用函数,但是函数定义在库里面,需要链接将其关联起来,这样函数调用的时候就可以找到函数的定义了)

ps:语言给我们提供的一般是一套头文件+一套库文件,我们使用printf的函数,实际上就是在库里面实现的。

记忆方法/-o选项的使用

1.我们在指定输出文件的名称时,这两种写法都行,-o表示输出到目标文件

gcc mytest.c -o mytest
gcc -o mytest mytest.c

2.前三个过程使用选项和生成文件的记忆方法:

  1. gcc-E,-S,-c,记忆方法,对应的就是键盘左上角的esc键
  2. 生成的文件分别是.i  .s  .o,刚好是对应的iso,一个镜像文件的后缀

四.gdb——调试器

Q:为什么要加-g才能调试

程序的发布方式有两种,debug模式和release模式

Linux gcc/g++出来的二进制程序,默认是release模式

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项,使其变成debug模式

如果一个程序是可以被调试的,该程序的二进制文件一定如入了一些debug信息!

我们看到release模式下,生成的可执行文件的大小比debug模式下要小,因为加上-g,变成debug模式后,加入了一些debug信息,所以才能对其进行调试。


常用选项

  • listl 行号:显示当前行号开始的10行代码,再输入l接着上次的位置往下
  • listl 函数名:列出某个函数的源代码。
  • rrun运行程序。
  • n next单条执行。(逐语句,不会进入函数)
  • sstep进入函数调用(逐过程,会进入函数)
  • break(b) 行号:在某一行设置断点
  • 函数名:在某个函数开头设置断点
  • info b :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。(display是每次n或者s都显示,p是只打印一次)
  • set var:修改变量的值
  • continue(c):从当前位置开始连续而非单步执行程序(直到下一个断点)
  • run(r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoint(b) n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值(可以display &变量名看地址)
  • undisplay:取消对先前设置的那些变量的跟踪(后面跟的是变量对应的编号,而不是变量名)
  • until X行号:跳至X(注意对比finish,continue,until的区别和用法,可以快速定位问题大概的位置)
  • breaktrace(bt):查看各级函数调用及参数
  • infoi) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

五.make/Makefile——自动化构建工具

(1).概念

1.make是一个命令,Makefile是一个文件,两个搭配使用,完成项目自动化构建(形成可执行程序,不需要我们自己gcc项目中的所有文件)

2.依赖关系

Makefile内部可以让我们写上依赖关系和依赖方法

只有依赖关系和依赖方法共同作用才可以达到目的


(2).使用

1.touch 一个名为Makefile文件(也可以是makefile)

添加依赖关系/依赖方法

2.比如我们现在有mytest.c文件,要生成mytest的可执行文件。

此时mytest的生成依赖于mytest.c,依赖方法是通过gcc

第一行是依赖关系前者:(:表示依赖,这里表示前者依赖后者)后者,第二行是依赖方法(注意第二行必须是Tab键开头)

  1 test:test.cpp
  2     gcc -o test test.cpp

3.此时我们直接使用make指令单走就可以自动根据mytest.c生成mytest可执行文件。此时不做任何修改再make,会提示已经是最新的了,无法再make了。

添加清理功能

1.在Makefile文件中添加:

  1 test:test.cpp
  2     gcc -o test test.cpp
  3 .PHONY:clean
  4 clean:
  5     rm -f test 

        注意这里的.PHONY:clean就是一个修饰,表示指定伪目标,对当前文件可以一直执行make clean。后面的clean :后面是空,实际上就是表示没有依赖关系。第二行的就是依赖方法,意思就是可以直接执行依赖方法,不需要依赖关系。而上面的test:后面就有依赖关系,就是要依赖test.cpp

2.直接make clean,会发现刚刚make生成的可执行文件没了。

3.Linux下的make和make clean就类比于vs中的生成解决方案和清理解决方案

Q:.PHONY有什么用

  1. .PHONY:clean就是一个修饰,表示指定伪目标,对当前文件可以一直执行make clean
  2. 像make,我们如果不对齐进行修改,第二次就无法执行make,这就不具备总是可执行这一性质,但是clean就可以一直被执行,因为经过.PHONY修饰是一个伪目标
  3. 如果我们给mytest也加上.PHONY,则我们也可以一直make,但是没必要,你没有修改源文件,按理说就不需要make
  4. clean :后面是空,实际上就是表示没有依赖关系。第二行的就是依赖方法,意思就是可以直接执行依赖方法,不需要依赖关系。而上面的test:后面就有依赖关系,就是test.cpp

(3).原理

1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。

2.如果找到,它会找文件中的第一个目标文件,比如这里我们make的时候会找第一个目标文件,也就是这里的mycode,并把其当做最终的目标文件。

3.如果目标文件不存在,根据依赖关系找mycode所依赖的文件mycode.o,找到后执行依赖方法生成文件。

4.如果不存在,就继续往后找,找当前mycode.o依赖的文件,找到以后执行依赖方法生成,然后在返回去生成原来的目标文件。执行流程像一个栈

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

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

相关文章

客快物流大数据项目(八十三):Kudu的优化

文章目录 Kudu的优化 一、​​​​​​​Kudu关键配置 二、​​​​​​​​​​​​​​Kudu的使用限制 1、​​​​​​​​​​​​​​主键 2、Cells 3、​​​​​​​字段 4、表 5、其他限制 6、​​​​​​​​​​​​​​分区限制 7、扩展建议和限制 8、​…

2- 创建Spring项目—— 方式1

导包: 地址:https://repo.spring.io/ui/native/libs-release-local/org/springframework/spring/ 如:包名:spring-5.2.3.RELEASE-dist.zip 将其下libs文件夹下的4个jar包导入: spring-context-5.2.3.RELEASE.jar、…

物联网ARM开发-3协议-单总线应用红外遥控

前言:单总线类传感器-红外遥控的实现 目录 一、红外遥控工作原理讲解 1、光的基础知识 2、红外通信 3、红外NEC协议详解 二、红外遥控实例讲解 1、实验目的:按下遥控按键,主机通过红外接收器接收到信号并解码,识别出按键的…

大学生计算机相关专业有什么血泪建议吗?

工作多年后才发现大学期间错过太多!!!给正在攻读CS的你,以下建议: 神级编程网站,堪称程序员的充电站,我给你找好了不能错过_程序员编程指南的博客-CSDN博客_程序员充电网站 大的课程很多&…

LA-PEG-NH2,Lipoic acid-PEG-Amine,硫辛酸PEG氨基用于量子点表面

表面反应性聚乙二醇聚乙二醇化试剂LA-PEG-NH2,又名Lipoic acid-PEG-Amine其中文名为硫辛酸-聚乙二醇-氨基。所属分类为Amine PEG Lipoic acid(LA)PEG。 该科研试剂Lipoic acid-PEG-Amine的分子量均可定制有:(5000、20…

uboot移植一一更换控制台串口

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 1、场景需求 X210开发板的SOC中一共有4个串口(串口0~3),并且用DB9接口引出了2个串口,分别是串口0和串口2。其中靠近网口的是串口0,远离网口…

java毕业设计——基于java+java-swing的泡泡堂网络游戏设计与实现(毕业论文+程序源码)——泡泡堂网络游戏

基于javajava-swing的泡泡堂网络游戏设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于javajava-swing的泡泡堂网络游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录: 基于javajava-…

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---高度控制

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---高度控制前言构建软件框架编译 cpp构建代码main函数构建构建类的定义订阅无人机里程计信息垂直位置控制串级P控制收敛结果收敛过程串级PID控制前言 无人机(Unmanned Aerial Vehicle&#…

Oracle中分割字符串的方法

Oracle中分割字符串的方法1. 使用 regexp_substr() 函数1.1 方式11.2 方式22. 自定义函数2.1 自定义类型 table2.2 自定义函数2.2.1 自定义函数2.2.2 效果如下:2.3 Oracle查看<Collection> 类型数据3.1. 使用 regexp_substr() 函数 1.1 方式…

日志三个时间,动静态库的建立与使用

文章目录日志时间ModifyChangeAccessmake与g库lddfile静态库动态库静态库静态的制作静态库的使用动态库动态库的制作动态库的使用日志时间 Modify 最近修改文件内容的时间在一定条件下,修改文件内容时,可能修改文件属性:文件大小属性改变了 …

实验2:Numpy手写多层神经网络

引言 这个作业的目的是给你们介绍建立,训练和测试神经系统网络模型。您不仅将接触到使用Python包构建神经系统网络从无到有,还有数学方面的反向传播和梯度下降。但在实际情况下,你不一定要实现神经网络从零开始(你们将在以后的实验和作…

【数据结构与算法】详解快排

目录一、快排的定义及思路二、快排的代码实现一、快排的定义及思路 快排就是快速排序,是通过不断比较和移动交换来进行排序,相当于冒泡排序的一种升级。 其基本思想是: 分而治之,也就是把一组数组分成两个独立数组,再对…

【初学者入门C语言】之结构体(十一)

个人主页:天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 💬 刷题网站:一款立志于C语言的题库网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com) 特别标注:该博主将长期更新c语言内容,初学c语言的友友们&#xff0c…

【树莓派不吃灰】使用中经常看到的安装命令 wget、rpm、yum、dpkg、apt-get

目录1. 前言2. Linux系统两种主流软件包2.1 rpm包2.2 deb包3. 解决软件依赖问题 —— yum、apt3.1 yum3.2 apt 和 apt-get4. wget 网络文件下载工具5. 总结❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-10-28 ❤️❤️ 本篇…

设计模式之备忘录模式 - 简书

备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 解决方案 我们刚才遇到的所有问题都是封装 “破损” 造成的。 一些对象试图超出其职责范围的工作。 由于在执行某些行为时需要获取数据, 所以它们侵入了其…

ipv6学习笔记221029

IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写 ipv6的长度有128位, ipv4的长度是32位 ipv6以冒号:分隔 , ipv4以点.分隔 8个16位等于128位 , 4个十六进制表示16位(一个16进制表示4位) ipv6的128位 由 8 个 16位 16bit 组成 每…

【LeetCode】【两个数组的交集】

力扣 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 示例 2: 输入:num…

基于MATLAB的指纹识别算法仿真实现

目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 在指纹图像预处理部分,论文对预处理的各个步骤包括规格化、图像分割、中值滤波、二值化、细化等以及各个步骤的方法进行了深入的分析和研究,选择了一种图像预处理方案。在指纹特征提取部分…

基于javaweb的医疗挂号管理系统(java+springboot+freemarker+layui+mysql)

基于javaweb的医疗挂号管理系统(javaspringbootfreemarkerlayuimysql) 运行环境 Java≥8、MySQL≥5.7 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 基…

幼儿园小程序实战开发教程(终篇)

我们已经写了四篇教程,涵盖了需求分析及各个页面,本篇是我们的最终篇。 咨询信息 我们小程序需要收集家长和孩子的信息,为此我们也规划了数据源。如果按照传统开发思路,那我们是要依次实现信息采集的每个字段,然后再…