Linux:常用工具yum/vim/gcc/gdb/make-Makefile/git使用方法及指令详解

文章目录

      • yum-软件包管理器
      • vim-编辑器
      • gcc-编译器
        • 库文件
        • gcc链接方式:
      • gdb调试器
        • Linux下调试一个程序的前提是什么?
        • 最常见的调试操作有哪些,如何使用?
      • make/makefile 项目自动化构建工具
      • Git 项目版本控制工具
        • 简单操作
      • 缓冲区对文件读写的影响

yum-软件包管理器

  • Linux下软件安装方式:源码安装-手动安装/工具安装-自动检测解决依赖关系库的安装
  • yum :
    • 产看能够安装哪些安装包 -yum list | grep Packge_name
    • 查看已经安装了那些安装包 -yum list installed |grep Packge_name
    • 安装软件包 -yum install packge_name
    • 移除安装包 -yum remove packge_name
  • lrzsz://只可用于Xshell
    • rz 从主机传输文件到服务器/虚拟机;
    • sz filename 从虚拟机/服务器传输指定文件到主机;

vim-编辑器

  • vim共有12种模式,最常用的有3种:
    • 普通模式:
      • 完成编辑一个文件最常见的操作
      • 光标移动,赋值,粘贴,剪切,撤销,恢复撤销
    • 插入模式:
      • 插入数据
    • 底行模式:
      • 保存-w
      • 退出-q
      • vim设置
  • vim filename---->进入普通模式
  • 普通模式–?-->插入模式
    • i-从光标所在位置开始插入
    • I-光标移动到行首,开始插入
    • a-光标向后移动一位字符,开始插入
    • A-光标移动到行尾,开始插入
    • o-从光标所在行下方添加新行,开始插入
    • O-从光标所在行上方添加新行,开始插入
  • 插入模式 ---->普通模式
    • Esc
  • 普通模式–:-->底行模式
  • 普通模式下操作:
    • 光标移动:
      • hjkl-左下上右
      • w/b-向右/左移动一个单词
      • ctrl+f/b-向下/上翻页
      • gg/G-文档首行/尾行
    • 复制/粘贴:
      • yy-复制光标所在行
      • nyy-向光标所在行开始向下复制n行
      • p-向光标下方粘贴新行
      • P-向光标所在行上方粘贴新行
    • 剪切/删除:
      • x-按字符删除
      • p-粘在字符后方;P-粘在字符前方
      • dw-删除光标所在单词;
      • dd-删除光标所在行
      • ndd-从光标所在行开始向下删除
    • 撤销:
      • u-一直撤销到上次保存
      • Ctrl+r-恢复撤销
  • 底行模式操作:
    • :q-退出
    • :w-保存
    • :wq-保存并退出
    • :q!-推出不保存
    • :set nu //设置行号
    • :! Commend-临时执行commend
    • /string-向下查找string字符串
    • ?string-向上找string字符串

gcc-编译器

  • 将高级语言程序(C语言)编译成为机器可识别的指令代码
  • 编译过程:
运行步骤 执行操作 生成文件
预处理 头文件展开/宏替换/条件编译/注释删除 .i
编译 语法/词义/语意…检查,生成汇编代码 .s
汇编 将汇编代码转为机器码(复杂指令集/精简指令集) .o
链接 链接代码库以及所有的代码文件,生成可执行程序

库文件

  • 一些常用的功能接口;问了防止每次编译浪费时间,因此将这些码进行汇编编译,并将汇编完成的代码储存到一个文件中,这个文件就叫库文件
  • 如果这是用户想用库函数,这时就需要包含头文件,因为头文件声明这个函数存在,这时候编译器在头文件中检测到了这个声明,就知道有这个函数的时间,就不会报错了;
  • 最终链接生成可执行程序的时候,因为具体让CPU处理指令,因此就必须将这些接口的具体实现拿过来

gcc链接方式:

  • 静态链接:
    • 链接静态库:链接时,将代码直接写入到可执行程序中
    • 优点:运行时不依赖库的存在
    • 缺点:占用资源较多,如果大量程序静态链接,会在内存中造成代码冗余;
    • 更新时需要重新编译
  • 动态链接:
    • 链接动态库只记录接口在库函数中的位置符号信息,并不拷贝代码实现
    • 优点:占用资源少,在内存中大量程序可以共享使用(共享库)
    • 缺点:运行时需要依赖库的存在
    • 更新时替换文件即可
  • gcc编译器的默认连接方式:动态链接;

gdb调试器

Linux下调试一个程序的前提是什么?

  • 生成一个Debug程序,添加调试符;
    • Linux下gcc默认生成Realse版本
    • -g生成Debug版本程序-添加调试符号
    • gcc -g main.c -o main;
  • gdb加载程序:
    • gdb ./main(程序名称)||gdb–>file ./main(程序名称)
  • 或许运行参数,并运行成序
    • r±a -l -s…
    • 如果没赋参数,默认调取上一次参数;

最常见的调试操作有哪些,如何使用?

  • 打印内容
    • p(print) 变量;
  • 单步调试
    • start 开始逐步调试
    • l(list)查看调试行附近代码;l file:line;
    • n(next)-下一步-不进入函数内部,直接将函数运行-F10
    • s(step)-下一步-跟踪进入函数-F11
    • until-直接运行到指定行;until file:line;
  • 打断点
    • b(break):打断点-b file:line给指定行;b function_name给函数
    • i(info):查看调试信息-i b 查看断点信息
    • d(delete):删除断点-d b_id(断点编号)
    • watch :变量监控 watch var name
    • c(continue):继续开始运行
  • 查看调用栈
    • bt :快速定位程序崩溃位置;

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

  • makefile:普通文本文件,记录了项目的构建流程规则
  • make:一个解释程序,到当前执行make命令的目录下寻找makefile文件,并且对makefile中记录的项目构建规则进行解释执行;
  • makefile:编写规则
    • 目标对象:依赖对象
    • tab制表符+指令;
  • make执行规则:
    • 解释执行时,在makefile中寻找目标对象(只需寻找第一个目标对象),找到目标对象后,执行命令操作
    • 如果有目标对象,判断目标对象是否存在:
      • 如果目标对象不存在:执行命令操作-生成目标对象;
      • 如过目标对象存在:
    • 判断是否有依赖对象 :
      • 若无依赖对象直接报错(目标最新)-不需要重新生成;
      • 如果有依赖对象:
    • 判断依赖对象是否存在?
      • -依赖对象存在:通过目标对象和依赖对象的最后一次修改时间判断是否需要重新生成目标对象,执行操作命令-生成目标对象
      • 依赖对象不存在:make继续在makefile中寻找依赖对象的生成规则,先生成依赖对象,再生成目标对象
    • 预定义变量:
      • $@:目标对象
      • $^:所有依赖对象
      • $<:依赖对象中的第一个
    • 通配符
      • %.o/%.c:所有.o目标对象的生成规则 (只可在Makefile用)
      • *.c获取当前路径下所有.c文件,可通用,但在Makefile的gcc里会颠倒顺序;
    • wildcard 获取指定文件名–获取当前目录下以.c结尾的文件名
    • patsubst 字符串替换–对src变量内容进行替换,将.c替换成.o
    • .PHONY :声明伪对象-不管目标对象是否存在,是否最新,每次都重新生成;
    • #为注释
  • 使用基础语法
all: main child
main:main.o child.o//(目标对象:依赖对象)
    gcc main.c child.c -o main// (tab制表符+指令)
child:main.o child.o
    gcc main.c child.c -o main
child.o:child.c
    gcc child.c -o child.o
main.o:main.c
    gcc main.c -o main.o

  • 使用预定义变量替换后:
all: main child
main:main.o child.o
    gcc $^ -o $@
child:main.o child.o
    gcc $^ -o $@
child.o:child.c
    gcc $^ -o $@
main.o:main.c
    gcc $^ -o $@
  • 加入通配符:
all: main child
main:main.o child.o
    gcc $^ -o $@
child:main.o child.o
    gcc $^ -o $@
%.o:%.c
    gcc -c $^ -o $@
  • 加入wildcard/patsubst
src = $(wildcard ./ *.c)
obj = $(patsubst %.c,%.o,$(src))//$(a)表示a变量,a表示a字符串
all: main child
main:$(obj)
    gcc $^ -o $@
child:$(obj)
    gcc $^ -o $@
%.o:%.c
    gcc -c $^ -o $@
  • 加入声明伪对象
src = $(wildcard ./ *.c)
obj = $(patsubst %.c,%.o,$(src))
all: main child
main:$(obj)
    gcc $^ -o $@
child:$(obj)
    gcc $^ -o $@
%.o:%.c
    gcc -c $^ -o $@
.PHONY:
clean:
    rm $(obj) main child

Git 项目版本控制工具

简单操作

  • 下载仓库:
    • git clone
  • 提交代码:
    • git add
    • git commmit -m “back”
  • 上传代码:
    • git push origion master

缓冲区对文件读写的影响

  • 文件并没有直接写入文件,而是写入到缓冲区(内存)中,等到缓冲区中数据写满或者刷新缓冲区的时候,才会将数据这整的写入到文件
  • 回车与换行:
    • 回车:输出位置移动到起始位置
    • 换行:输出位置移动到下一行
  • 对于显示器文件来说,\n具有换行/刷新缓冲区(相当于fflush);
  • fflush(stdout);
  • \r回车:从输出开始位置重新输出

你可能感兴趣的:(Linux)