Linux——开发工具的使用

目录

Linux软件包管理器 yum

rzsz

Linux编辑器——vim

        vim的使用

        vim的基本操作

        命令模式的常见命令

        底行模式的常见命令

         vim是需要配置的

Linux编译器——gcc/g++

        预处理

        编译

        汇编

        链接

函数库

Linux项目自动化构建工具 make/makefile

make原理

项目清理

Linux调试器gdb


Linux软件包管理器 yum

简单的把它理解为“应用商店”就可以,我们可以来安装第一个软件。

rzsz

        这个工具用于windows机器和远端的linux机器通过xshell传输文件,可以通过拖拽的方式将文件传上去。

通过yum list命令可以看到所有的软件包。

yum list | grep lrzsz

使用下面这个指令就可以下载它了。

sudo yum install lrzsz -y 

想要卸载的话,使用这个就可以了。

sudo yum remove lrzsz

Linux编辑器——vim

       我们在网上随便一找就可以找到这张键盘图,这就是大部分的vim的使用方法,但也没有必要全记住,用哪个记哪个就可以了。

       vim它是一个编辑器,换言之它只能写代码,和我们平常用的编译器还是有差别的,我用的vs编译器它是一个集成的开发环境,它既可以编写代码、调试代码,也可以运行程序等,但是vim它只能写代码,就像记事本一样。

       那它只能写代码,我们为什么还要用它呢?在linux下的编辑器还是很多的,但是对于初学的时候,vim还是能在众多编辑器中脱颖而出的,它是许多系统默认装机数最高的,虽然学习成本有一点高,但是不要灰心,并没有那么难学,在linux下我们还是要编写代码的,所以vim是比较优的选择。

        vim的使用

首先要进入vim

#vim //会出现一些版本信息等
#vim [文件名] //如果这个文件没有就创建并进入vim

想要退出vim,首先按下键盘的Esc,输入(:q)(这是一个整体)就可以退出。

这个只是测试vim能不能使用。

        vim的基本操作

vim是一款多模式的编辑器,它有命令模式、编辑(插入)模式和底行模式。

       首先输入vim [文件名]命令进入vim,这是一个全屏幕编辑画面,进入vim默认的就是命令模式,我们需要进入到插入模式才可以编写代码。

开始进入默认的命令模式的左下角就是这样的,或者什么都没有。

[命令模式]切换至[插入模式]
输入a
输入i
输入o
输入过后左下角就会变成这样,这就进入到了插入模式。

[插入模式]切换至[命令模式]
直接按下键盘左上角的Esc
输入后屏幕左下角就变成了空白。
 
那我们想要退出vim,就可以进入到底行模式
[命令模式]切换至[底行模式]
输入:也就是冒号
再输入命令

:w   (保存当前文件)

:q    (退出)

:wp (保存并退出)

:!     (加上 ! 就代表强制,出现问题的时候可以加上!)

 

 由图可知,插入模式和底行模式不能切换。

        命令模式的常见命令

yy:将当前光标所在行进行复制,nyy可以复制多行

p  :将复制的内容进行粘贴,np可以粘贴多次

dd:将当前光标所在的行,进行剪切(删除),也可以使用ndd

u  :撤销

ctrl + r:撤销u的操作

shift + g(G):将光标定位到文件的结尾

gg:将光标定位到文件的最开始

n + shift + g:将光标定位到文件的第n行

shift + 6(^)  :将光标定位到当前行的最开始

shift + 4($)  :将光标定位到当前行的结尾

w、b:以单词为单位进行光标的向后、向前移动,也可以nw、nb使用

h、j、k、l:向左、向下、向上、向右移动光标

shift + ~:大小写的切换

shift + r :进入替换模式,可以替换光标指向的内容

r :替换光标所在的字符,同样可以使用nr

x or shift + x(X):删除光标所在的字符,之后or之前,也支持nx

        底行模式的常见命令

:set nu:显示行号

:set nonu:取消显示行号   

:vs (文件名):分屏操作

ctrl + ww:分屏下切换操作的文件

:! + 指令:在vim的底行模式下执行linux下的指令

         vim是需要配置的

       如果你现在正在使用原生的vim来写代码,那么第一个感觉应该就是很麻烦,那是因为vim是需要配置的,我们需要配置一个好用的环境来写代码。

       首先我们要在当前的用户目录下要有一个.vimrc的文件,我们需要在这个文件中添加vim的配置项,那有哪些配置项呢,那可以百度一下,想要什么样的效果就添加什么效果的配置项到文件.vimrc中;如果嫌麻烦,也可以找一些插件,这里我就不过多介绍了。


Linux编译器——gcc/g++

        前面的vim满足我们写代码的要求,gcc和g++就可以帮我们编译代码,gcc这个软件可以说是大部分操作系统自动默认安装的,g++可能没有,不要担心,就算是gcc没有我们也可以下载。

       在这之前,我们也可以先来讨论一下程序的翻译过程,编译器做的工作不就是把我们认识的语言转化成计算机认识的语言吗。下面我们就来介绍我们写的代码是怎么一步步的翻译成了计算机认识的语言也就是二进制的指令。

        预处理

在这一部分要处理的就是:

1.去注释 2.宏替换 3.头文件展开 4.条件编译

下面我们介绍一下简单的选项:

-E:让gcc在预处理结束后停止翻译过程

-o:让.c文件编译成指定名字的文件

因为在Linux下直接gcc -E .c文件,他会把内容直接打印出来,所以我们用gcc -E .c文件 -o 指定的文件。

//我的.c文件就是mytest.c,里面有简单的代码
# gcc -E mytest.c -o mytest.i//指定的文件就是指定文件名

       然后就可以看到目录下有一个mytest.i的文件,我们用vim打开,G选项直接到最底可以看到原来的代码变成了800多行的,这就是把头文件全展开了,进行了宏替换,注释都没有了,条件编译执行了,所以这就是预处理的操作。

       最后在说一下,我们写代码的时候,在头文件中的开头都会写上#pragma once,这句代码就是让我们的头文件不要重复编译,以免代码过长。

        编译

编译就是把C语言转换为汇编语言。

# gcc -S mytest.i -o mytest.s

选项-S:让gcc在编译结束后停止翻译过程,生成汇编语言

这里用.i或者.c都可以都是到编译就停止

        汇编

把汇编语言变成可重定位目标二进制文件

# gcc -c mytest.s -o mytest.o

这个.o文件和我们Windows下的obj文件是一样的

选项-c:让gcc在汇编结束后停止翻译过程,生成可重定位目标二进制文件

        链接

# gcc mytest.o -o mytest

执行这个命令就可以生成可执行程序

函数库

       在链接的过程还可以再说一点其他的,一般的链接过程有两种方式,动态链接静态链接

       动态链接需要动态库,静态链接需要静态库。这也是我们一直默默在用的,只是我们自己可能不知道。

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。
  • 动态库不是这样的,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。

动态链接:
 优点:省空间(磁盘的空间,内存的空间),bin体积小,加载速度快。
 缺点:依赖动态库,程序可移植性较差。
静态链接:
 优点:不依赖第三方库,程序的可移植性较高。
 缺点:浪费空间。

gcc和g++生成的文件默认就是动态链接,使用file指令就可以查看。

使用ldd指令可以查看动态链接的可执行文件所依赖的库。

这个/lib64/libc.so.6就是c标准库,linux下的很多指令也是用c语言写的,使用ldd /user/bin/ls也可以看到这条依赖关系。

        可执行文件就是把函数和库中的实现链接起来,你写的C语言的printf函数,它到最后也是要和库中链接起来的。gcc和g++默认采用的是动态链接,但如果我们需要使用静态链接,带上-static选项即可。有的云服务器可能没有一些静态库,这时候就需要你自己去下载了。

由此可见,动态和静态链接的内存还是差别很大的。


Linux项目自动化构建工具 make/makefile

        简单来说,make是一个命令makefile是一个文件,以后的工程的源文件会有很多个,文件的编译顺序也是有要求的,而make和makefile写好就可以帮助我们自动化构建项目。

        想要编写makefile就要知道两点:依赖关系依赖方法。

依赖关系:文件1改变会影响文件2,这就是文件2依赖于文件1。

  • 比如,.o文件是由.c文件通过预处理、编译、汇编之后生成的文件,.c文件就会影响.o文件,所以.o文件依赖于.c文件。

依赖方法:文件2依赖于文件1,那么由文件1生成文件2的方法就是依赖方法。

  • .o文件依赖于.c文件,那么gcc -c -o test.c test.o这条命令就是.o依赖于.c的依赖方法。

        那么下面就来用一下make和makefile。

        在目录下随便写了一段代码,下面这张就是makefile文件,写完了之后就可以使用make来生成可执行程序。

make原理

  • make会在当前目录下找名字为“Makefile”或“makefile”的文件
  • 如果找到,它会找文件中的第一个目标文件,也就是上图中,会找到mytest这个文件,并把这个文件作为最终的目标文件。简单来说就是看看makefile中的第一个目标文件是否存在,也就是mytest是否存在。
  • 但是一开始这个文件是不存在的,或者mytest的所依赖的文件被修改了或者说根据文件的修改时间,那就会通过依赖方法生成这个文件,也就是gcc编译生成一个文件。

使用stat命令就可以查看文件的修改时间。

这也是Linux下文件的ACM。

  • 如果mytest所依赖的文件(test.c)不存在,那么make会在makefile文件中寻找目标为mytest依赖的文件(test.c)的依赖关系(例如test.c: ... ),如果找到则再根据其依赖方法生成test.c文件,但是上面实例中没有可以生成test.c的依赖关系。
  • 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件
  • 在寻找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。

Makefile文件的简写方式:

  • $@:表示依赖关系中的目标文件(冒号左边,例如mytest)。
  • $^:表示依赖关系中的依赖文件列表(冒号右边全部,上面的例子只有一个)。

下面就是简写的样式

项目清理

  • 项目是需要被清理的。
  • clean这个就是清理的依赖关系,通常命名成clean,它不需要依赖任何文件,使用的时候直接输入make clean命令就可以执行下面的依赖方法。
  • clean通常要设置为伪目标,使用.PHONY修饰后,无论输入多少次都会执行这句,如果不修饰,就会出现这样的情况。

修饰后就会一直执行


Linux调试器gdb

        程序的发布方式有两种,分别是debug和release。Linux下gcc和g++编译出来的二进制可执行程序默认是release的,想要变成debug模式就要加-g选项。

之后就可以进入gdb调试界面了。

        gdb会记录最近一条命令,如果还想使用这个命令,可以直接使用回车。接下来就开始介绍需要使用的命令。

r/run:开始调试,类似于vs下的f5,如果没有设置断点就直接结束
b(break)+行号:在这一行打断点
i(info)+b(breakpoint):查看当前所有断点
d(delete)+断点编号:删掉这一行的断点
n(next):逐过程,类似f10
s(step):逐语句,类似f11
p(print):打印表达式的值
bt(breaktrace):查看各级函数调用及参数,相当于查看调用堆栈
finish:执行到当前函数返回
display+变量名:跟踪查看一个变量,每次停下都显示它的值
undisplay+常显示编号:取消常显示
until+行号:跳转至该行
c(continue):从当前位置开始运行到下一个断点处
disable+断点编号:禁用断点
enable+断点编号:启用断点
q(quit):退出gdb

这些就是常用的命令,熟能生巧,多多练习才可以熟练的使用。

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

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

相关文章

260.【华为OD机试真题】信道分配(贪心算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-信道分配二.解题思路三.题解代码Python题解代码…

踩坑实录(Fourth Day)

今天开工了,其实还沉浸在过年放假的喜悦中……今天在自己写 Vue3 的项目,虽说是跟着 B 站在敲,但是依旧是踩了一些个坑,就离谱……照着敲都能踩到坑,我也是醉了…… 此为第四篇(2024 年 02 月 18 日&#x…

天锐绿盾|公司办公文件数据\资料自动智能透明加密——数据防泄漏系统

天锐绿盾是一款专注于企业电脑文件数据资料透明加密的防泄密系统。它采用了先进的文件过滤驱动透明加解密技术,可以对企业核心部门的文档进行强制加密处理,确保从文档创建开始就能自动加密保护。文件的保存加密、打开解密完全由后台加解密驱动内核自动完…

React中的函数组件

import React from ./react; import ReactDOM from ./react-dom;/*** 函数组件其实是一个函数&#xff0c;接收props,返回一个React元素*/ function FunctionComponent(props){let element <h1><span>hello</span>,{props.name}</h1>;console.log(el…

2024年热门项目持续分析,趣味测试小程序项目分析以及系统功能介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 趣味测试小程序是目前比较热门的娱乐测试&#xff0c;运行模式就是引导粉丝用户进去…

【《高性能 MySQL》摘录】第 3 章 服务器性能剖析

文章目录 3.1 性能优化简介3.1.1 通过性能剖析进行优化3.1.2 理解性能剖析 3.2 对应用程序进行性能剖析3.3 剖析 MySQL 查询3.3.1 剖析服务器负载捕获 MySQL 的查询到日志文件中分析查询日志 3.3.2 剖析单挑查询使用 SHOW PROFILE &#xff08;现已过时&#xff09;使用SHOW ST…

记录 | C++ cout.setf(ios::fixed)

cout.setf(ios::fixed); 是在 C 中使用的一个标准库函数&#xff0c;用于将流的输出格式设置为"fixed" "fixed"格式指定输出浮点数时&#xff0c;小数点后的位数是固定的。这意味着&#xff0c;无论输出的数字有多少位小数&#xff0c;小数点后都会保留相…

Win32 获取EXE/DLL文件版本信息

CFileVersion.h #pragma once#include <windows.h> #include <string> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 版本号辅助类 class CVersionNumber { public:CVersionNumber() :m_…

Qt程序设计-无边框可移动可拖拽调整大小窗体

本文讲解Qt-无边框可移动可拖拽调整大小窗体。 通过鼠标的按下移动进行窗体的移动,拖拽调整窗体大小。 实现过程如下: 创建QWidget窗体,添加一个按钮控制窗体的关闭。 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget>#include <QMouseEvent> //定…

【天衍系列 05】Flink集成KafkaSink组件:实现流式数据的可靠传输 高效协同

文章目录 01 KafkaSink 版本&导言02 KafkaSink 基本概念03 KafkaSink 工作原理1.初始化连接2.定义序列化模式3.创建KafkaSink算子4.创建数据源5.将数据流添加到KafkaSink6.内部工作机制 04 KafkaSink参数配置05 KafkaSink 应用依赖06 KafkaSink 快速入门6.1 包结构6.2 项目…

【深度学习:数据注释工具】构建与购买:从业者的经验教训

【深度学习&#xff1a;数据注释工具】构建与购买&#xff1a;从业者的经验教训 为什么数据注释团队需要标记工具&#xff1f;您的软件工程团队是否有时间/资源来构建数据注释解决方案&#xff1f;为您的项目构建数据注释工具需要多长时间&#xff1f;将开发外包给第三方会更有…

异地组网延迟怎么解决问题?

异地组网中的延迟问题可以通过SD-WAN&#xff08;Software-Defined Wide Area Network&#xff09;技术进行解决。SD-WAN可以通过优化网络流量和智能路由选择来降低延迟&#xff0c;提高应用程序的性能和用户体验。接下来将介绍使用SD-WAN解决异地组网延迟问题的常用方法。 1.…

SSH密钥认证登陆流程(Vscode连接到远程)

目录 前言连接远程步骤1. 下载工具包wsCli到本地机器2. 本地机器上生成ssh密钥3. 在服务器上安装公钥4. vscode连接到远程 参考资料 前言 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和安全传输数据的网络协议。它提供了两种主要的远程连接方式&#xff1a; 密…

学习总结18

# 营救 ## 题目背景 “咚咚咚……”“查水表&#xff01;”原来是查水表来了&#xff0c;现在哪里找这么热心上门的查表员啊&#xff01;小明感动得热泪盈眶&#xff0c;开起了门…… ## 题目描述 妈妈下班回家&#xff0c;街坊邻居说小明被一群陌生人强行押上了警车&#…

有趣的CSS - 新拟态输入框

我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;《有趣的css》系列已更新 11 篇了&#xff0c;今天这篇是关于新拟态风格的一个输入框效果&#xff0c;希望你们喜欢。 目录 页面效果核心代码html代码css代码 完整代码html页面css样式 页面效果 此效果使用 css 中 b…

C/C++输出输出相关问题

C/C输出输出相关问题 scanf(“%d”),如果缓存区的开始是数字&#xff0c;scanf会读入&#xff0c;直到遇见非数字字符&#xff0c;否则远不会读入 #include<iostream> using namespace std; int main() {int a[100];char c[100];// scanf的返回值为“所输入的数据与格式字…

html5播放 m3u8

注意&#xff1a;m3u8地址要为网络地址&#xff0c;直接把代码复制为html直接在本地打开&#xff0c;可能不行&#xff0c;需要放在nginx或者apache或者其他的web服务器上运行。 <!DOCTYPE html> <html> <head><meta charsetutf-8 /><title>测试…

通过kafka学习数据一致性

kafka哪些环节存在数据不一致 数据复制 数据从主节点&#xff08;leader&#xff09;复制到从节点&#xff08;follower&#xff09;的过程中&#xff0c;由于网络延迟、节点故障或其他原因 可能导致从节点未能及时获取或处理主节点的数据变更&#xff0c;从而产生数据不一致…

PDF控件Spire.PDF for .NET【安全】演示:如何在 PDF 中添加签名字段

Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库&#xff0c;开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理&#xff0c;且无需安装 Adobe Acrobat。 E-iceblue 功能类库Spire 系列文档处…

js之es新特性

ES6 (ECMAScript 2015) 1. let 和 const let 允许声明一个块作用域的变量。const 允许声明一个块作用域的常量。 let x 10; if (x 10) {let x 20; // 这里的 x 和外面的 x 不是同一个变量console.log(x); // 20 } console.log(x); // 10const y 5; // y 10; // 会抛出错…