Linux 中的各种工具

学会在 Linux 上编写、运行代码
学会在 Linux 上进行下载安装
学会使用 vim 上传代码

关于Linux 开发工具

IDE(集成开发环境)

开发者和程序员进行软件设计和开发所需的工具和设施的集合,它提供了可以编写和测试代码的环境
eg. VS:既能编写(编辑),又能编译、运行,既能写C,还能写 C++……以及一系列功能

接下来在 Linux 中使用的各种工具都并非 IDE

Linux 软件包管理器 yum

● 什么是软件包
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序
—— 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装
软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.
yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上

可以将 yum 和手机里的应用商店类比
Linux 通过 “yum源” 里的记录的网址进行下载安装,可以通过以下路径查看 yum源
在这里插入图片描述

安装一个拓展源(非官方,但不代表它不行):
在这里插入图片描述
yum list:罗列出当前可下载的所有软件

yum list | grep ls //搭配查找使用(在所有可下载软件中找带ls的)

● 关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!
可以通过 ping 指令验证

ping www.baidu.com

● 查看软件包
通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包. 例如:

 yum list | grep lrzsz

在这里插入图片描述

软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
“x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配.
“el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6.
最后一列, base 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店” 这样的概念

● 安装软件

如果 sudo 指令无法执行那就先登录 root 用户去下载吧 —— 至于为什么不行,本篇笔记在后面的vim里就有讲

sudo yum install lrzsz

yum 会自动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装
出现 “complete” 字样, 说明安装完成

安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外
一个软件, yum会报错.
如果 yum 报错, 请自行百度

● 卸载软件

sudo yum remove lrzsz

编辑器 vim

vim 是编辑器,本质和记事本、之前用的 nano 在功能上没有区别,只是更高效
● 为什么要学 vim
我们需要一款上了服务器就能直接编写代码的编辑器,而 Linux 的几乎任何一款环境都有vim,哪怕没有也能迅速装上

格式:vim 文件

vim 的基本操作
刚使用 vim 进入文件时,处于“命令模式”,输入 i 即可进入“插入模式”写代码,想退出vim则先ESC从“插入模式”回到“命令模式”,再 Shift + : (其实就是 : 只是不加shift就成 ; 了)切到“底行模式”,输入 wq(写入保存并退出)即可(输入 q 则是直接退出)

在这里插入图片描述

常用命令

1.命令模式常见命令

● yy 复制光标当前所在行;5yy:复制 5 行
● p 粘贴复制的行(到光标所在行后一行);100p:粘贴100次
● u 撤销历史操作
● Ctrl + R 撤销刚才的撤销
光标定位 行
● Shift + g(也就是 G)光标定位至文件结尾
● n + Shift + g 光标定位至第 n 行
● gg 光标定位至文件开头
光标定位 当前行
● Shift + 4($)光标定位至当前行的结尾
● Shift + 6(^)光标定位至当前行的开头
● b,w 单词为单位向前,后移动;
5w:光标向前5个单词
● h,j,k,l 光标向左、下、上、右移动

在这里插入图片描述

也可以联想《泰坦尼克号》里的 jump 情景记忆 j 是在往下跳……

● dd 剪切当前所在行;8dd 剪切以下 8 行
● x 删除光标所在位置;支持 nx;Shift + x(即 X)删除 x 前
● Shift + ~ 大小写切换
● Shift + r 可进行替换(进入替换模式,ESC退出);也可以直接 r ;支持 nr

● 批量注释/消除注释:
Ctrl + v 进入视图模式,用 hjkl (小写)选中区域,I (大写),输入 //,再按 ESC
Ctrl + v 进入视图模式,用 hjkl (小写)选中区域,d 删除 // 即可

2.底行模式常见命令
set nu/nonu 显示/不显示行号

分屏操作
● vs 文件(vs 有对比的含义)分屏
● Ctrl + ww 切屏

● w 写入
● q 退出
● !命令 不退出 vim 执行对应的命令(Enter 回到 vim)

关于 vim 的配置

你看自己的vim,不会自动缩进,显示高亮不够智能……使用便捷度似乎还远不及 VS —— 因而我们确实需要一个不错的配置来改善vim的使用体验(关于配置的原理现在还不用太过看重)

想要配置 vim,需要有一个 .vimrc 文件,没有的话则 touch 创建一个(似乎一般都在主目录下创建,即:~/.vimrc);
—— 也正因为 .vimrc 创建在指定用户的工作目录下,所以只对相应的用户起作用

可以选择自己在网上寻找 vim 的配置项,放进文件中即可

● 但是强烈推荐这位老师的项目(有人把饭喂自己嘴里的感觉真是太爽了):
VimForCpp: 快速将vim打造成c++ IDE

使用实例:sudo 指令 ★

临时提升用户权限至 root 级别(仅限此命令)
但想要使用 sudo 命令需要将该用户添加至 root 的信任列表里:

通过 root 用户打开:
在这里插入图片描述

差不多在 110 行有这样一条语句:
在这里插入图片描述
然后这样添加你想要添加的用户至信任列表:
在这里插入图片描述
然后用 w! 强制保存, q! 强制退出

至此我们不在使用 root,而是用以上用户

编译器 gcc/g++

可以先通过执行 gcc -v 、 g++ -v (查看版本号)看自己的 Linux 是否自带这两个编译器(一般来说都自带 gcc,g++不一定)

使用普通用户,如果出错,那就是 sudo 部分添加信任列表搞错了

(如果不自带)下载安装:
在这里插入图片描述
这个 gcc-c++ 就是C++的编译器 g++(Linux下的名字不同)

● gcc 是一个专门用于编译链接 C语言的编译器,g++则是C++(兼容C语言,处理 C 也没有问题)

格式:gcc 文件:直接处理成 .out 可执行文件(相当于win上的.exe)

关于编译链接

编译器都依照统一的编译链接的准则进行,所以 gcc、g++这方面和 VS 之类的编译器并无区别
—— 但我们可以借助 gcc 更好地观察这个过程

选项

-o指定处理后的文件的名字
-E从现在开始进行程序的翻译,完成程序的 预处理 后停止(生成 .i 文件)
-S从现在开始进行程序的翻译,完成程序的 编译 后停止(生成 .s 文件)
-c从现在开始进行程序的翻译,完成程序的 汇编 后停止(生成 .o 文件)
-g形成的可执行文件为 debug 版本(后面会用到)

记忆:ESc – iso

称.o文件为“可重定向文件”——这个可重定向和之前的重定向 > 没有任何关联
-o 使用示例:
(不用 -o 时)自动生成名为 a.out 的文件:
在这里插入图片描述
-o 指定生成文件名为 test.out
在这里插入图片描述
也可以写成 gcc -o test.out test.c (只要 -o 后面跟着的是要形成的文件就行)(不过显然没有上面的直观吧)

-E 使用示例:
在这里插入图片描述
可见,文件完成了预处理(左 test.i 有 test.c)
在这里插入图片描述

-S -c 同理;最后的链接过程用 gcc test.o -o test.out 处理即可

运行 .out 文件

./test.out

与 ls 这些指令不同,这里不能直接 test.out 运行文件,ls 默认当前路径,但可执行程序依赖环境变量 PATH 下查找,需要手动加 ./

动静态库

一般链接的过程有两种方式:动态链接 和 静态链接 (分别依赖动态库和静态库)

ldd 命令可用于打印程序或者库文件所依赖的共享库列表
file 命令可用于辨识文件类型、辨别一些文件的编码格式等等

操作系统\库动态库静态库
Linux.so.a
Windows.dll.lib

● 动态链接的进行则是在程序执行时(把库中方法(函数)的地址填入可执行文件中,建立关联)—— 依赖库,但节省资源
● 静态链接是在形成可执行程序前(直接把库中方法(函数)的实现直接拷到我们的可执行程序中)—— 不依赖库,但比较占用资源

在这里插入图片描述
gcc test.c -o test_static -static :表明使用静态链接的方式形成可执行文件 test_static

但因为云上机器可能没有静态库导致命令无法执行:在这里插入图片描述
此时我们需要安装静态库:
在这里插入图片描述

Linux 项目自动化构造工具 – make/Makefile

make:一个命令
makefile(或 Makefile):一个文件

makefile 我们在以后用到的不多,因为以后更多的是系统就自动给我们把 makefile 给构建了,我们需要学的是它的原理,在以后 makefile 自动被构建时明白发生了什么

makefile 的主要构成:依赖关系 和 依赖方法

编写 makefile 的目的:构建项目(通过makefile编译源代码,自动形成可执行文件)

示例

  1. touch 创建一个Makefile 文件;进入编写:
    在这里插入图片描述
    在这里插入图片描述

以上 :的左侧为目标文件,右侧为依赖文件列表

  1. make执行
    在这里插入图片描述

至此,可执行文件被构建,那么如果我们想将其清理掉呢?

  1. 打开 Makefile 并写入:
    在这里插入图片描述
  2. make clean 执行清理
    在这里插入图片描述

.PHONY 伪目标 – 用.PHONY 指定一个伪目标,伪目标不代表一个真正的文件名(即上面的 clean 不像_test 一样真的是一个文件名),在执行 make 时可以指定这个目标来执行所在规则定义的命令

在这里插入图片描述
● 第二次执行 make 时,系统(通过比较源文件和相应的可执行程序的最近修改时间得知文件已经是最新)会认为无需执行(可以用 touch 已存在的文件 这个指令更新文件修改的时间);
● 而执行 make clean 时,首先,因为这个指令不会创建一个 clean 文件,所以一定会执行;
即便你自己创建了一个 clean 文件,也会因为跟在 .PHONY 后面的 clean 只是个伪文件,不会被妨碍执行(这才是这里用 .PHONY 的意义)
● 我们习惯给 clean 设置 .PHONY

补充:stat 指令:显示文件或文件系统的详细信息
在这里插入图片描述
可以用来查看文件最近被访问、修改的时间:
Access:访问文件
Modify:文件内容修改
Change:文件属性修改

● 使用 make 时 Makefile 文件自顶向下扫描,make 只会帮我们形成第一个遇到的目标文件;
而执行其他命令需要:make + 名字

似乎也正因为这个机制,Makefile 第一行的 _test 可有可无,改成啥都无所谓,反正 make 就行,而其他的目标文件就要好好起名以便自己使用了

● Makefile 默认如果目标文件没有指定依赖,则依赖于所有源文件

因此即便把 _test: 后面的 test.c 删掉,后面命令执行也不受影响

● 练习:Linux 小程序:进度条

回顾一下上面讲的 gcc 和 make

准备知识 1:回车 与 换行
回车:返回当前行的开头,用 \r 表示
换行:直接跳到下一行与本行相同位置,用 \n 表示
——但为了方便,经常将两命令结合使用(Enter 键就是这样,\n 也经常被处理成回车+换行的含义),老式键盘的 Enter 键的样子就在暗示着 Enter 执行的是 换行 + 回车;

准备知识2:缓冲区
关于 Linux 的缓冲区
其实对于此处的小程序实现,需要知道只有 fflush(stdout); 可以把缓冲区清空,把其中的数据给输出出来即可

实操
Makefile 文件:

probar.out:probar.c
	gcc -o probar.out probar.c
.PHONY:clean
clean:
	rm -rf probar.out

probar.c 文件:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#define N 102
int main(){
    char arr[N]={0};
    memset(arr,0,N);
    const char sign[] ="|/-\\"; 
    int count = 0;
    while(count < N-1){
        printf("[%-100s][%d%%]%c\r",arr,count,sign[count%4]);//打印%:%%
        arr[count] = '#';
        count++;
        fflush(stdout);
        usleep(30000);//usleep 单位为微秒
    }
    printf("\n");
    return 0;
}

makefile深入
老师写的一个makefile文件 和 它运行的结果如下:
在这里插入图片描述
可以看到,makefile / make 会自动根据文件中的依赖关系进行自动推导,帮助我们执行所有相关的依赖方法(去形成我们第一行写的要形成的目标文件 code.exe)

只是演示,我们是不会这么写的

我们后面想要的makefile:
在这里插入图片描述

@ 和 ^ 分别指代目标文件和依赖文件,$则表示提取其中的内容

改进:makefile支持变量:
在这里插入图片描述
改进:
在命令语句前添加@可以使得make执行该语句时不打印出该语句
依赖方法不止可以写一行
在这里插入图片描述

bin=pro.out
src=pro.c
$(bin):$(src)
	@gcc -o $@ $^
	@echo "compiler $(src) to $(bin)..."
.PHONY:clean
clean:
	@rm -f $(bin)
	@echo "clean project"

至此makefile文件算是有模有样了

git 版本控制器

可以这样查看自己的系统有没有 git :
在这里插入图片描述
● 什么是版本控制:
好比你的甲方拿到你的初版报告后要求你一改再改,改着改着却要求换回最初版本或者经常要求回到某个改版开始继续修改,面对这些情况,你需要记录自己的初版报告以及所有的改版便于操作……如此这般,就是版本控制

● 版本控制器的诞生
显然对于程序员而言,不停地手动拷贝程序、进行整理以达到保存各版本的目的是在太过繁琐,所以有了软件来实现这些操作 —— 也就是 git 这些版本控制器

● git 与 Gitee、GitHub 的关系
git 是提供版本控制功能的软件,而 Gitee、GitHub 是代码托管的网站/平台,其底层采用的技术就是 git(实际操作:通过 git 将代码上传至 Gitee,就这样让 Gitee 托管代码,以后要查看自己上传的东西的话只需要登录 Gitee 查看即可)

实际使用

  1. 在 Gitee 上创建仓库

创建期间会遇到 “添加 .gitignore” 选项 —— 什么意思?
在这里插入图片描述
● 众所周知,以常用的 VS 为例,其在编译后一定会产生许多文件,而我们需要维护的只是我们自己写的代码,需要上传的只有我们写的.c .cpp .h 文件(当然,想要传些别的你觉得确实有用的东西也没人管你),为了避免我们错传上一堆没有意义的文件,gitignore 作为一个配置文件,其内部有常见的不需要的文件的后缀,可以拦下这些不需要的文件
● 当然你也可以打开 .gitignore 文件自己添加不想上传的文件的后缀名

  1. git clone 创建的仓库链接

(远程)仓库链接:
在这里插入图片描述

然后就能看到路径下多了个目录:
在这里插入图片描述
进入该目录后查看:
在这里插入图片描述
这个 .git 文件就是我们的 git仓库(本地仓库),用 git 上传代码至 Gitee 时就是在同步 .git 文件

  1. 用 git 上传文件

● git add 文件 或者.(把当前目录里没添加到仓库的全添加到仓库里去)

这一步是将文件放入预备提交的区域中

● git commit -m “提交日志” (这些都是必写的,提交日志一般写的都是在此次的提交中做了什么改动)

这一步将文件从预备提交区域提交到本地仓库(即 .git 文件中)

首次提交时有提醒把你拦下来:
在这里插入图片描述
提醒设置名称和邮箱 – 之前 clone 时输入过用户、密码,但那是 Gitee 的;就像团队协作一起使用同一个远程仓库,每个人还得设置自己的个人信息(方便追责
按提示设置即可:
在这里插入图片描述
然后再commit一次就行

● git push

提交本地仓库的变化到远端仓库

比如我创建了 test.c 文件,想要上传至 Gitee 只需执行以上的操作
这里是可以进行配置不输密码的……但老师建议现在先不要这样 —— 你总该去多熟悉自己的 git
在这里插入图片描述

git pull
多人协作完成项目时,git 需要保证每个人看到的代码都是最新修改过的,于是当A B两人同时修改刚刚获取的代码时,A先提交,B后提交,B 提交会出错,此时需要使用 git pull 将 A 刚才的提交与 B 自己的代码进行同步才行

提交冲突 —— 无脑 git pull

git rm 文件:删除文件

Linux 代码调试 gdb

gcc、g++默认行程的可执行程序是 release 版本的,无法直接调试

gcc test.c -g //-g:形成的可执行文件为 debug 版本

gdb (基础)操作

开始 / 退出调试
● gdb (debug版本的)可执行文件 :进入 gdb
● quit :退出 gdb

● l :(list)显示代码
调试过程
● r :(run)类比 VS 里的 F5
● n :(next)逐过程 (类比 F10)
● s :(step)逐语句(类比 F11)
● finish :将当前函数跑完
● until :跳转到指定行
断点
● b n :(break)在第 n 行打断点
● d x :(delete)删除编号为 x 的断点
● info b :查看断点
● disa x(disable):使编号为 x 的断点失效
● enable x :使编号为 x 的断点有效
● c :运行到下一个断点处
查看变量
● p 变量名 :(print)打印变量内容
● display 变量名 :常显示变量内容
● undisplay x :取消编号为 x 的常显示
● bt :调用堆栈

● set var 变量名 = 数值:修改变量数值

gdb 会记录最近的一条命令,如果命令无变化,可以直接回车

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值