【Linux】零基础学会linux环境基础开发工具使用(yum,vim,makefile,gdb)

文章目录

Linux软件管理器 yum

🚩什么是软件包

1 ,下载软件方法:下载程序的源代码,然后编译,得到可执行程序,

2,这种方法太麻烦了,所以有人把源代码打包,做成软件包放在服务器,能够直接安装软件包
软件包和软件包管理器的关系,相当于APP和应用商店,yum就是软件包管理器

安装软件

⭐ 例如gcc安装

sudo yum install lrzsz

注意:

1,安装要切换到root用户,如果子用户输入su 再输入root密码切换root用户

2,yum下载是装完一个再下载另一个

好玩的软件

移动火车

sudo yum install sl

下载完成输入sl

会说话的奶牛

sudo yum install cowsay

下载完成后输入 cowsay "hello"

卸载

也是一条命令

sudo remove lrzsz

Linux编译器vim

vim基本概念

vim有好多模式,我们主要学习3种,分别是命令模式,插入模式,底行模式

  • 命令模式(normal mode):就是普通模式,进行光标移动,字符或行删除,移动复制进入某区段,以及按 i 进入插入模式,按:进入底行模式
  • 插入模式(insert mode):只有在该模式下,才可以输入文本,按esc回到命令模式
  • 底行模式(last line mode):文件保存退出,也可以进行文件替换,给文本添加行号 :wq保存并退出,:q不保存退出

vim命令模式命令集

假设有个文件 text.txt

vim text.txt

进去就是命令模式,

gg :定位光标到第一行开头
shift+g:定位光标到最后一行开头
n+shift+g:定位光标到目标行开头

shift+^: 定位光标到当前行开始
shift+¥:定位光标到当前行末尾

w,b: 单词按照光标跨单词移动
h,j,k,l,光标左下上右移动

(n)yy:复制当前(n)行
(n)dd:剪切(删除)当前行
(n)p:粘贴当前行到光标下一行

u:撤销
crtl+r:撤销上次撤销

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

代码到执行,编译器进行4步

1,预处理(进行宏替换)
2,编译(生成汇编)
3,汇编(生成机器可识别代码)
4,链接(生成可执行程序)

预处理

假设有文件 test.c

⭐ 功能:宏定义,文件包含,条件编译,去掉注释

使用:

gcc -E test.c -o test.i

-E 代表代码进行完预处理后停止编译过程

-o 是目标文件,test.i是预处理后的代码

编译

功能:检查代码规范性,是否有错误, 来确定代码要干的工作,无误后生成汇编代码

使用:

gcc -S test.i -o test.s

-S代表编译后停止汇编过程

汇编

功能:生成机器可识别的二进制目标代码

使用:

gcc -c test.s -o test.o

⭐链接

使用:

gcc test.o -o test

假设这个程序中有printf函数

问题来了:

🚩 <stdio.h>中只有printf声明,我们在代码块中也没实现printf函数,那么printf函数到底怎么实现的呢

答案:系统把这些函数都放进lib.c.so.6文件中了,使用时gcc会系统默认搜索路径去user/lib寻找,也就是链接到lib.c.so.6库文件中,就能实现printf函数,这就是链接作用

函数库

静态库:

指的是,编译链接时,把库文件全部拷贝到可执行文件中,因此文件比较大,但是后续再也不需要库文件了 后缀 .a

静态编译

gcc test.c -o test -static

动态库:

没有拷贝,程序执行时链接文件加载库,可以减少系统开销,后缀一般 .so,如上面的lib.c.so.6

gcc默认编译使用动态库,可以用file验证


明显看到静态文件比动态大几十倍,

默认dynamically linked

Linux自动化构建工具Makefile/makefile

makefile好处:自动化编译,写好了直接make命令就可以完成整个项目的编译

make是命令,makefile是文件

使用

本来需要g++ text.c -o mytext

现在只需要make命令就行 ,自动生成mytext可执行文件

make只会执行第一条指令

依赖关系

c 复制代码
mytext:mytext.o
        g++ mytext.o -o mytext
mytext.i:text.c
        g++ -E text.c -o mytext.i
mytext.s:mytext.i
        g++ -S mytext.i -o mytext.s
mytext.o:mytext.s
        g++ -c mytext.s -o mytext.o
.PHONY:clean
clean:
        rm mytext

生成mytext需要mytest.o接下来会自动寻找执行,

🚩原理

1,使用make,会在当前目录寻找makefile或Makefile文件

2,如果没有mytext文件或者后面mytext.o修改时间比mytext新,会把mytext作为最终目标去生成,

用stat查看时间

以Change修改时间为准,(每次cat grep都会修改Access时间,导致不必要的重新编译)
改变文件属性就是Change(w.r.x,重命名也是),只有改变文件内容才是Modify
若mytext.o修改时间新于mytext,用make生成mytext文件,否则make不会更新

🚩清理

  • 项目是需要被清理的
  • clean没有和第一个文件直接或间接关联,所以不会自动执行,但是可以用make clean清理
  • 我们给clean伪目标.PHONY,意思是总是被执行的

gdb

背景:

1,程序发布两种模式debug release

2,默认release

3,采用gdb调试。必须在生成二进制代码时 加上 -g

启动 gdb ./可执行文件

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

  • list/l 函数名:列出某个函数的源代码。

  • r或run:运行程序。

  • n 或 next:单条调用。

  • s或step:进入函数调用

  • break(b) 行号:在某一行设置断点

  • break 函数名:在某个函数开头设置断点

  • info break :查看断点信息。

  • finish:执行到当前函数返回,然后挺下来等待命令

  • print( p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

  • p 变量:打印变量值。

  • set var:修改变量的值

  • continue(或c):从当前位置开始连续而非单步执行程序

  • run(或r):从开始连续而非单步执行程序

  • delete breakpoints:删除所有断点

  • delete breakpoints n:删除序号为n的断点

  • disable breakpoints:禁用断点

  • enable breakpoints:启用断点

  • info(或i) breakpoints:参看当前设置了哪些断点

  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值

  • undisplay:取消对先前设置的那些变量的跟踪

  • until X行号:跳至X行

  • breaktrace(或bt):查看各级函数调用及参数

  • info(i) locals:查看当前栈帧局部变量的值

  • ==quit:退出gdb ==

进度条

c 复制代码
#include "progressBar.h"
int main()
{
    progressbar(40000);
    return 0;
}

progressBar/makefile

c 复制代码
progress:progressBar.cpp main.cpp
	g++ -o $@ $^
.PHONY clean:
	rm progress

progressBar/progressBar.cpp

c 复制代码
#include "progressBar.h"
#include <unistd.h>
#include <cstring>
#define NONE "\033[m"
#define RED "\033[0;32;31m"
#define LIGHT_RED "\033[1;31m"
const char* lable="/-\\|";
char bar[NUM];
void progressbar(int speed)
{
     Initbar();
     size_t len=strlen(lable);
     for(int i=0;i<=TOP;)
     {
         printf(LIGHT_RED "[%-100s]" NONE RED "[%d%%] [%c]\r" NONE,bar,i,lable[i%len]);
          fflush(stdout);
          bar[i]=body;
          i++;
          if(i!=TOP)
          {  
          bar[i]='>';
          }
          usleep(speed);       
     }
     fflush(stdout);
     printf("\n");;
}
void Initbar()
{
    memset(bar,'\0',sizeof(bar));
}

progressBar/progressBar.h

c 复制代码
#pragma once
#include <iostream>
#include <cstdio>
using namespace std;
#define NUM 102
#define TOP 100
#define body '='
#define right '>'
extern void progressbar(int speed);
extern void Initbar();
相关推荐
东城绝神17 小时前
《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.21.5容器版集群》
linux·运维·docker·架构·consul
ajassi200017 小时前
开源 Linux 服务器与中间件(三)服务器--Nginx
linux·服务器·开源
wheeldown17 小时前
【Linux】Linux进程间通信:命名管道(FIFO)的模拟实现重要知识点梳理
linux·运维·服务器
Crazy________17 小时前
34部署LNMP架构详细解析
linux·运维·服务器·nginx
xzal1217 小时前
C++之理解共用体
c++
_OP_CHEN17 小时前
C++基础:(十六)priority_queue和deque的深度解析
开发语言·c++
tan180°17 小时前
Linux网络HTTP(上)(7)
linux·网络·http
C++ 老炮儿的技术栈17 小时前
include″″与includ<>的区别
c语言·开发语言·c++·算法·visual studio
BS_Li17 小时前
C++IO库
c++·io流
小醉你真好17 小时前
17、Centos9 安装 1Panel
linux·docker·运维开发