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
这些就是常用的命令,熟能生巧,多多练习才可以熟练的使用。
相关文章:

LInux——开发工具的使用
目录 Linux软件包管理器 yum rzsz Linux编辑器——vim vim的使用 vim的基本操作 命令模式的常见命令 底行模式的常见命令 vim是需要配置的 Linux编译器——gcc/g 预处理 编译 汇编 链接 函数库 Linux项目自动化构建工具 make/makefile make原理 项目清理 Linux调试器g…...

沁恒CH32V30X学习笔记03--64位systick
systick CH32F2x 系列产品Cortex-M3 内核自带了一个 24 位自减型计数器(SysTick timer)。支持 HCLK 或 HCLK/8 作为时基,具有较高优先级别(6)。一般可用于操作系统的时基。 CH32V3x 系列产品内核自带了一个 64 位加减计数器(SysTick),支持 HCLK 或者 HCLK/8 作为时基,…...

【JavaEE】IP协议
作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…...
计算机网络-数据通信基础
目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系,把每日所学的知识梳理出来,既能够当作读书笔记,又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念:信源、信道、信宿&…...

【lesson53】线程控制
文章目录 线程控制 线程控制 线程创建 代码: 运行代码: 强调一点,线程和进程不一样,进程有父进程的概念,但在线程组里面,所有的线程都是对等关系。 错误检查: 传统的一些函数是,成功返回0&…...

TypeScript(一):TypeScript基本理解
TypeScript基本理解 为什么使用TS JavaScript发展至今,没有进行数据类型的验证而我们知道,在编程阶段,错误发现的越早越好而TS就解决了JS的这个问题 认识TypeScript TypeScript是拥有类型的JavaScript超级,它可以编译成普通、…...

C语言—指针
碎碎念:做指针题的时候我仿佛回到了原点,总觉得目的是为了把框架搭建起来,我胡说的哈31 1.利用指针变量将一个数组中的数据反向输出。 /*1.利用指针变量将一个数组中的数据反向输出。*/#include <stdio.h> #include <time.h> #include <…...

c++作业
Shell中的函数(先调用后使用的原则)(没有申明) (Function) 函数名(有没有参数根据调用格式)(不能写任何内容) { 函数体 Return 返回值 } 函数名 ----》…...

什么是tomcat?tomcat是干什么用的?
前言 Tomcat是一个开源的、轻量级的应用服务器,是Apache软件基金会的一个项目。它实现了Java Servlet、JavaServer Pages(JSP)和Java Expression Language(EL)等Java技术,用于支持在Java平台上运行的动态W…...

中科院一区论文复现,改进蜣螂算法,Fuch映射+反向学习+自适应步长+随机差分变异,MATLAB代码...
本期文章复现一篇发表于2024年来自中科院一区TOP顶刊《Energy》的改进蜣螂算法。 论文引用如下: Li Y, Sun K, Yao Q, et al. A dual-optimization wind speed forecasting model based on deep learning and improved dung beetle optimization algorithm[J]. Ener…...

C# 如何实现一个事件总线
EventBus(事件总线)是一种用于在应用程序内部或跨应用程序组件之间进行事件通信的机制。 它允许不同的组件通过发布和订阅事件来进行解耦和通信。在给定的代码片段中,我们可以看到一个使用C#实现的Event Bus。它定义了一些接口和类来实现事件…...

Python学习路线图
防止忘记,温故知新 进阶路线...

作业2.14
chgrp: 只能修改文件的所属组 chgrp 新的组 文件名 要求:修改的目标组已经存在 chown: chown 新的用户名 文件名 sudo chown root :1 将文件1的所属组用户和所属组用户都改为root sudo chown root:ubuntu 1 将文件1的所属用户…...

基于python+django+mysql的小区物业管理系统
该系统是基于pythondjango开发的小区物业管理系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可以在github给作者留言。主要功能有:业主管理、报修管理、停车管理、资产管理、小区管理、用户管理、日志管理、系统信息。 演示…...

控制与状态机算法
控制与状态机算法是计算机科学、电子工程和自动化领域中常用的一种设计工具,它用来描述一个系统的行为,该系统在不同时间点可以处于不同的状态,并且其行为取决于当前状态以及输入的信号或事件。状态机算法的核心概念包括: 状态(State):系统的任何可能配置。每个状态代表…...

sql常用语句小结
创建表: create table 表名( 字段1 字段类型 【约束】【comment 字段1注释】, //【】里面的东西可以不用加上去 字段2 字段类型 【约束】【comment 字段2注释】 )【comment 表注释】 约束:作用于表中字段上的规则…...

云计算基础-虚拟机迁移原理
什么是虚拟机迁移 虚拟机迁移是指将正在运行的虚拟机实例从一个物理服务器(或主机)迁移到另一个物理服务器(或主机)的过程,而不会中断虚拟机的运行。 虚拟机拟机迁移分类虚 热迁移:开机状态下迁移 冷迁…...

云计算基础-云计算概念
云计算定义 云计算是一种基于互联网的计算方式,通过这种计算方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。云计算依赖资源共享以达成规模经济,类似基础设置(如电力网)。 云计算最基本的概念就是云加端,我们有一个…...

如何将阿里云服务器迁移
📑前言 本文主要是如何将阿里云服务器迁移实现数据转移的文章,如果有什么需要改进的地方还请大佬指出⛺️** 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日…...

如何将本地的python项目部署到linux服务器中
大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 。 前言 本地写好的python项目,如何部署在服务器上运行呢?今天,我们就来抽一点点时间来看看。(网上找的资料,大部分都囫囵吞枣的…...

每日五道java面试题之java基础篇(五)
目录: 第一题. final、finally、finalize 的区别?第二题. 和 equals 的区别?第三题.hashCode 与 equals?第四题. Java 是值传递,还是引⽤传递?第五题 深拷贝和浅拷贝? 第一题. final、finally、finalize 的…...
HiveSQL——用户行为路径分析
注:参考文档: SQL之用户行为路径分析--HQL面试题46【拼多多面试题】_路径分析 sql-CSDN博客文章浏览阅读2k次,点赞6次,收藏19次。目录0 问题描述1 数据分析2 小结0 问题描述已知用户行为表 tracking_log, 大概字段有&…...

专利的申请
申请发明或者实用新型专利的,应当提交请求书、说明书及其摘要和权利要求书等文件。 请求书应当写明发明或者实用新型的名称,发明人或者设计人的姓名,申请人姓名或者名称、地址,以及其他事项。 说明书应当对发明或者实用新型作出清…...

嵌入式学习 C++ Day5、6
嵌入式学习 C Day5、6 一、思维导图 二、作业 1.以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴…...

阿里云香港服务器cn2速度测试和租用价格表
阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品,中国电信CN2高速网络高质量、大规格BGP带宽,运营商精品公网直连中国内地,时延更低,优化海外回中国内地流量的公网线路,可以提高国际业务访问质量。阿里云服务…...

《学成在线》微服务实战项目实操笔记系列(P92~P120)【下】
史上最详细《学成在线》项目实操笔记系列【下】,跟视频的每一P对应,全系列18万字,涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳,参考这篇,相信会带给你极大启发。 四、课程发布模块 4.1 (课程发布)模块需求…...

php数据类型以及运算符、判断条件
php数据类型以及运算符 1. php数据类型2. 使用举例3. 运算符4. 判断条件if else elseif 1. php数据类型 包括 String(字符串)、Integer(整型)、Float(浮点型)、Boolean(布尔型)、Array(数组)、Object(对象)、NULL(空值) 2. 使用举例 1.字符串 2.整型 3.浮点型 4.布尔型 5.数组…...

大数据01-导论
零、文章目录 大数据01-导论 1、数据与数据分析 **数据:是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。**数据可以是连续的值,比如声音、图像,称为模拟数据;也可…...

智能网卡(SmartNIC):增强网络性能
在当今的数字时代,网络性能和数据安全是各行各业面临的关键挑战。智能网卡是一项颠覆性的技术创新,对增强网络性能和加强数据安全性具有关键推动作用。本文旨在探讨智能网卡的工作原理及其在不同应用场景中的重要作用。 什么是智能网卡? 智…...

算法刷题day14
目录 引言一、平均二、三国游戏三、松散子序列 引言 今天做了三道新题,类型是贪心、枚举、DP,不是特别难,但是努力一下刚好能够够得上,还是不错的,只要能够一直坚持下去,不断刷题不断总结,就是…...