【Linux】Linux工具

news2024/12/24 9:59:32

文章目录

    • 软件包管理器`yum`
    • `VIM`编辑器
    • `Linux`编译器-`gcc/g++`使用
      • `gcc`如何完成
      • 预处理(进行宏替换)
      • 编译(生成汇编)
      • 汇编(生成机器课识别代码)
      • 链接
      • 在这里涉及到一个重要的概念: 函数库
      • 函数库一般分为静态库和动态库两种
      • `gcc`选项
      • `gcc`选项记忆
    • `Linux`项目自动化构建工具-`make/Makefile`
      • 背景
      • 理解
      • 实例
      • 原理
      • 项目清理

软件包管理器yum

如何进行软件安装?
image-20230109185831807>
因为yum只需要下载一次其他用户就可以使用,所以我们使用yum 的时候,就一般用root身份

yum list | grep 关键字:搜索包含指定关键字的软件

yum install 软件名:下载指定的软件

yum remove 软件名:卸载指定的软件

正如我们的软件管家,这个软件商店/管家,它怎么知道去哪里下载呢?

这些软件管家必须知道各个软件的下载地址!一般都是内置下载链接的地址(配置文件)

yum怎么知道我要下载的软件在哪里? yum 有自己的配置文件称为“yum源”

cd /etc/yum.repos.d/ :进入yum源。

这里就要说说如何更新yum源了?

  1. 先备份老的yumCentOS-Base.repo
  2. wget 获取新的yum源配置文件,可以通过网络搜索得到
  3. mv重命名成为CentOS-Base.repo
  4. yum clean && yum makecache,:清理曾经的缓存,并换成新的

如果自己使用yum的时候没有问题,并且看到自己的yum源就是国内镜像源就不需要配置了

如果自己想安装的软件找不到,有可能就是再扩展的yum源当中:epel.repo

·sudo yum install -y epel -release, 根据你的base yum 源,帮我们找到和他匹配的扩展的yum

VIM编辑器

vim是一款多模式的编辑器,只要有多种模式就有每种模式的用法和区别,每种模式的相互切换

vim就是一个单纯的编辑器

yum install vim:下载vim

vim常见的几种模式:

  1. 命令模式

默认打开的模式就是命令模式 。大部分命令都是在命令行下执行

  • yy/nyy 复制当前行或者当前行在内的指定若干行
  • p/np粘贴一行或多行相同的内容到当前光标所在行之下
  • u:撤销刚刚的操作
  • ctrl + r:对撤销进行撤销
  • dd/ndd:对当前行或者当前行在内的n行进行剪切
  • 如果只进行dd不进行粘贴就是删除
  • shift g:将光标定位到文章结尾
  • gg:将光标定位到文章开始
  • n + shift + g:将光标定位到指定行
  • shift $:将光标定位到文档行的结尾
  • shift ^:将光标定位到文档行的最开始
  • nw nb 按照单词为单位,进行前后移动w向后b向前
  • shift ~:快速大小写切换
  • r/nr:替换光标所在的字符或者连同n
  • x/nx:行内删除,从左到右
  • n shift x :行内删除, 从右到左
  • h 左移动
  • j下移动
  • k:上移动
  • l:右移动
  1. 插入模式

  2. 底行模式

    1. set nu 显示行号

    2. set nonu:去掉行号

    3. %s///g:替换

    4. /key:搜索

    5. !command

    6. vs 文件名:分屏

    vim分屏模式下,光标在哪里我们就在编写哪一文件

    1. ctrl ww:切换光标到不同的界面
  3. 替换模式

  4. 视图模式image-20230105202458572

注意事项

  1. 如果你不知道自己在那个模式下,可以无脑esc,就可以直接进入命令模式
  2. 退出的时候一般都是先保存再退出
  3. vim不要用鼠标滑轮

vim配置

  1. 自己配置(不推荐)

vim在启动的时候,会自动在当前用户的目录下,寻找配置文件。如果没有就是默认。

一个用户,一个vim配置我们所做的配置不会影响其他人,配置所在目录是/home/vimtest

touch .vimrc-> vim .vimrc

  1. 自动化配置

可以直接执行这个命令,是vim更加智能化

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash./install.sh

然后再执行这句话就可以正常使用了source ~/.bashrc

如果不用的话,可以执行bash ~/.VimForCpp/uninstall.sh进行删除

Linux编译器-gcc/g++使用

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

gcc如何完成

gcc -o 编译完成的文件名 要编译的文件名, 指定编译完成的文件名

预处理(进行宏替换)

  • 预处理功能主要包括宏定义, 文件包含, 条件编译, 去注释等.
  • 预处理指令是以#开头的代码行
  • 实例: gcc -E hello.c -o hello.i
  • 选项-E, 该选项的作用是让gcc在预处理结束后停止编译过程
  • 选项-o是指目标文件, i文件为已经过预处理的C原始程序

编译(生成汇编)

  • 在这个阶段中, gcc首先要检查代码的规范性, 是否有语法错误, 以确定代码的实际要做的工作, 在检查无误后, gcc把代码翻译成汇编语言
  • 用户可以使用-S选项进行查看, 该选项只进行编译不进行汇编, 生成汇编代码
  • 实例: gcc -S hello.i -o hello.s

汇编(生成机器课识别代码)

  • 汇编阶段就是把编译器生成的.s文件转成目标文件
  • gcc -c hello.s -o hello.o, 将汇编代码转换成, 二进制目标代码了

链接

  • 在成功编译之后, 就进入链接阶段
  • 实例: gcc hello.o -o hello

在这里涉及到一个重要的概念: 函数库

  • 我们在C程序中, 并没有定义printf的函数实现, 且在预编译中包含的stdio.h中也只有函数的声明, 而没有定义函数的实现,那么是在哪里实现printf函数的呢?
  • 最后的答案是: 系统把这些函数实现定义到libc.so.6的库文件当中了, 在没有特别指定的时候, gcc会到系统默认的搜索路径usr/lib下进行查找, 也就是链接到libc.so.6库函数当中, 这样就能实现函数printf, 而这也是链接的作用

函数库一般分为静态库和动态库两种

  • 静态库是指编译链接时, 把库文件的代码全部加入到可执行文件当中, 因此生成的文件比较大, 但在运行时就不需要库文件了. 其后缀一般是.a
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀为.so, 如前面所述的libc.so.6就是动态库。gcc在编译的时候默认使用动态库。完成了链接之后,gcc就可以生成可执行文件如下所示gcc hello.o -o hello
  • gcc默认生成二进制文件, 是动态链接的,这样可以通过file命令验证

gcc选项

  • -E 只激活预处理, 这个不生成文件, 你需要把他重定向到一个输出文件里面
  • -S 编译到汇编语言不进行汇编和链接
  • -c 编译到目标代码
  • static 对生成的文件采用静态链接
  • -g 生成调试信息,GNU调试器可利用该信息
  • -shared 此选项将尽量使用动态库,所以生成的文件比较小,但是需要系统有动态库
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0没有没有任何优化,-O1为缺省值,-O3优化级别最高
  • -w不生成任何警告信息
  • -Wall生成所有警告信息

gcc选项记忆

esc iso

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

背景

  • 会不会写Makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录当中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,甚至进行更复杂的功能操作
  • makefile带来的一个好处就是—“自动化编译”, 一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令
  • make是一个指令,makefile是一个文件,两个搭配使用,完成项目自动化构建

理解

makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译的工具,完成一件事情必须要有正确的依赖关系依赖方法

.PHONY:总是被执行的

如何得知是否需要重新进行执行呢?

通过对比时间来进行

实例

image-20230109174614006

依赖关系

  • 上面的代码file依赖file.o
  • file.o依赖file.s
  • file.s依赖file.i
  • file.i依赖file.c

原理

  • make是如何工作的,在默认方式下,也就是我们只输入make命令那么:
  1. make会在当前目录下找名字Makefilemakefile的文件
  2. 如果找到,它会找文件中的第一个目标文件,在上面的实例中,它会找file这个文件,并把这个文件作为最终的目标文件
  3. 如果file文件不存在,或是file所依赖的后面的file.o文件的修改时间要比file这个文件新,那么会执行后面定义的命令来生成file这个文件
  4. 如果file所依赖的file.o不存在,那么make会在当前文件中找目标文件file.o所依赖的如果找到再根据那一个规则生成hello.o文件(这一点像堆栈的过程)
  5. 这就是整个make的依赖性,make会一层又一层的去找文件的依赖关系,知道最终编译出一个目标文件
  6. 在寻找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理
  7. make只管文件的依赖性,即,如果在找了依赖关系之后冒号后面的文件还是不存在,那就不工作了

项目清理

  • 工程是需要清理的
  • clean这种,没有被第一个目标文件直接或者间接的关联,那么后面定义的命令不会被自动执行,不过我们可以显示要make执行。即命令make clean来清楚所有的目标文件,以便重新编译
  • 但是一般我们这种clean目标文件,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是,总是被执行的

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

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

相关文章

解决vue中报错 Duplicate keys detected:‘1‘. This may cause an update error.

报错截图: 报错原因: 通过上图的报错信息我们不难看出,报错的主要原因出现在 key 值上,报错的意思大概是检测到重复的 key 值,通俗来讲就是你的 key 值不是唯一的。 解决方案: 问题的根源找到了&#xff…

【初阶数据结构】——链表常见面试题剖析

文章目录前言题目1:移除链表元素题目分析思路1:暴力求解思路2:取非val值尾插至新链表思路讲解思考代码实现不带哨兵位带哨兵位题目2:合并两个有序链表题目分析思路讲解代码实现不带哨兵位带哨兵位题目3:反转链表题目分…

用ode45解微分方程遇到的实际问题

最近在用ode45解微分方程数值解,试图复现论文中的图。一般来说说微分方程(组)只要按照响应的条件去撰写好对应的回调函数即可,基本没什么难度,但对于本文遇到的的这个问题,可能还需要一些技巧去实现解法&am…

动态路由和导航守卫

一、动态路由1、什么是动态路由?将URL地址中可变的内容设置成参数,根据不同的参数渲染不同的组件。(组件可以复用)2、动态路由如何进行参数的传递:(1)如何设置URL地址中的参数:’/ur…

【手写 Vue2.x 源码】第十二篇 - 生成 ast 语法树-流程说明

一,前言 上篇,主要介绍了 vue 数据渲染核心流程,涉及以下几个点: 初次渲染时 template 模板被编译为 ast 语法树;通过 ast 语法树生成 render 函数;通过 render 函数返回 vnode 虚拟节点;使用…

基于K8s的DevOps平台实践(三)

文章目录前言1. Jenkins与k8s集成🍑 插件安装及配置🍑 演示动态slave pod🍑 Pod-Template中容器镜像的制作🍑 实践通过Jenkinsfile实现demo项目自动发布到kubenetes环境2. Jenkins集成Sonarqube🍑 sonarqube架构简介&a…

初阶产品经理必看:如何快速进阶B端产品经理

​从去年开始,大批的互联网企业开始转战B端,众多传统企业也早在几年前就开始向互联网转型。 产业互联网的兴起,让一个岗位的潜藏价值正在逐渐爆发,尤其是富有经验的背景,更加让身价越来越高。 这个岗位就是&#xff…

QProcess的非阻塞式用法以及QApplication::processEvents的使用

一、QProcess的阻塞模式QProcess的应用场景非常广泛。可以使用它在qt程序中执行其他进程,并与之进行通信。当使用它执行一些终端命令和操作时,命令和操作往往是需要一定的时间的,这时QProcess本身提供了方法如:waitForStarted() /…

神经网络自适应PID控制及其应用

神经网络自适应PID控制及其应用 总结来自重庆大学宋永瑞教授2022暑期校园行学术会议 1. 研究背景 目前人工智能的发展为很多领域里的研究提供了可延展性,提供了新的研究问题的思路,无人系统和人工智能正走向深度融合,无人系统里具有核心驱动作…

C语言及算法设计课程实验三:最简单的C程序设计——顺序程序设计(四)

C语言及算法设计课程实验三:最简单的C程序设计——顺序程序设计(四)一、实验目的二、 实验内容2.4、将"China”译成密码三、 实验步骤3.4、顺序程序设计实验题目4:将"China”译成密码的实验步骤3.4.1、变量的定义与赋初…

Android EventBus源码深入解析

前言 EventBus:是一个针对Android进行了优化的发布/订阅事件总线。 github对应地址:EventBus 大家肯定都已经比较熟悉了,这里重点进行源码分析; EventBus源码解析 我们重点从以下三个方法入手,弄清楚register、unre…

关于sql注入这一篇就够了(适合入门)

本文章根据b站迪总课程总结出来,若有不足请见谅 目录 存在sql注入条件 判断数据库类型 注入mysql思路 判断网站是否存在注入点 判断列名数量(字段数) 文件读写操作 网站路径获取方法 注入类型 按注入点数据类型来分类 根据提交方式分类 猜测查询方式 sql…

(Java高级教程)第三章Java网络编程-第四节:TCP流套接字(ServerSocket)编程

文章目录一:Java流套接字通信模型二:相关API详解(1)ServerSocket(2)Socket三:TCP通信示例一:客户端发送什么服务端就返回什么(1)代码(2&#xff0…

量子计算(二十一):Deutsch-Josza算法

文章目录 Deutsch-Josza算法 Deutsch-Josza算法 量子算法是量子计算落地实用的最大驱动力,好的量子算法设计将更快速推动量子计算的发展。 Deutsch-Jozsa量子算法,简称D-J算法,DavidDeutsch和RichardJozsa早在1992年提出了该算法&#xff0…

分布式事务方案分析:两阶段和TCC方案(图+文)

1 缘起 补充事务相关知识过程中, 发现,默认的知识都是基于单体服务的事务,比如ACID, 然而,在一些复杂的业务系统中,采用微服务架构构建各自的业务, 就有了分布式事务的概念,比如&am…

一站式云原生体验|龙蜥云原生ACNS + Rainbond

关于 ACNS 龙蜥云原生套件 OpenAnolis Cloud Native Suite(ACNS)是由龙蜥社区云原生 SIG 推出的基于 Kubernetes 发行版本为基础而集成的套件能力,可以提供一键式部署,开箱即用,以及丰富的云原生基础能力,…

JProfiler的使用

一、安装 从https://www.ej-technologies.com/download/jprofiler/files获取,如果需要对服务器远程分析,注意服务器版本的jprofiler和windows版本一致。 二、监控一个本地进程 2.1 不使用idea 安装之后,打开jprofiler,点击红框…

电脑蓝屏并提示BAD_POOL_CALLER怎么办?

电脑蓝屏可以说是Windows的常见问题,各种各样的终止代码对应着不同的问题。如果你的蓝屏代码显示BAD_POOL_CALLER,这篇文章就是为你提供的。 可能导致BAD_POOL_CALLER蓝屏错误的原因: 1、硬件或软件不兼容 2、过时或错误的设备驱动程序 3…

DataWorks创建JavaUDF函数全流程

文章目录插件下载创建MaxCompute Studio项目创建MaxCompute Java Module编写Java UDF函数注意说明:这篇文章只是个人记录下,具体步骤都可以在官网找到。推荐看官网文档哈 插件下载 创建MaxCompute Studio项目 启动IntelliJ IDEA,在顶部菜单栏…

1806. 还原排列的最少操作步数

解法一: 根据题目的题目描述进行模拟,遇到偶数iii将arr[i]prem[i/2]arr[i] prem[i/2]arr[i]prem[i/2],遇到奇数iii,将arr[i]prem[(n−1i)/2]arr[i]prem[(n-1i)/2]arr[i]prem[(n−1i)/2] 时间复杂度: O(n2)O(n^2)O(n2), 最多会循环n次空间复杂度&#…