我们学习Linux是为了什么呢?当然是为了更好的开发,所以我们终于来到了开发之前的一个环节,学完该基础环节,我们就可以上手进行开发了,激动~
Linux开发必备工具
一、代码工具–vim
1、vim基本概念
vim我们主要使用三种模式,分别是命令模式、插入模式和底行模式
命令模式:用户所有的输入都会被认为是命令,可以控制屏幕光标的移动,字符、字、行删除,可以按i进入插入模式或按:进入底行模式
插入模式:用户所有的输入都会被认为是文本输入,按esc切换到命令模式
底行模式:用户用来进行文件保存或退出,进行文件替换,找字符串,列出行号等操作,按esc切换到命令模式
以下是vim的所有模式,共12种,六种basic modes,六种additional modes,在底行模式输入help vim-modes可以查看
2、vim操作
(1)命令模式
正常我们使用vim的时候,进入就是命令模式,下面是常用的命令
命令 | 作用 |
---|---|
gg | 定位光标到文章开始 |
G | 定位光标到文章最后 |
num+G | 定位光标到num行行首 |
$ | 定位光标到当前行结尾 |
^ | 定位光标到当前行开始 |
w,b | 光标按照单词进行行内跨行,进行移动 |
h,j,k,l | 光标左,下,上,右 |
(num)yy | 复制光标所在(num)行 |
(num)dd | 剪切、删除(num行) |
(num)p | 粘贴(num重复行)到光标所在行下一行 |
u | 撤销 |
ctrl+r | 反撤销 |
~ | 大小写转换 |
(num)r | 对光标字符以及之后的所有字符进行批量化替换 |
R | 对内容进行整体替换,也是一种模式,相当于是我们常用的第四种模式 |
(num)x | 对光标字符之后的字符进行删除 |
(2)插入模式
插入模式没啥可说的,进入插入模式就可以在文本中进行编辑了,此时输入的字符都会在文本中呈现出来的
(3)底行模式
命令 | 作用 |
---|---|
set nu | 列出文件每一行行号 |
(num) | 在底行模式下直接输入一个数字num直接转到num行 |
/+字符 | 类似于前面在命令中说的less命令的查找,/查找字符是往后查找,如果查找到的关键字不是你想要的,那么可以移植点按n键往后继续找 |
?+字符 | 同上,往后找 |
w | 保存文件 |
q | 退出文件 |
q! | 强制退出 |
wq | 保存退出 |
wq! | 强制保存退出 |
3、配置vim
我们没有配置的vim是不好用的,这个不好用指的是它并不是一个写代码的环境,因为它原本也只是一个文本编辑器,配置一下有利于我们进行代码的写入,所以以后写文本文件我们用nano,写代码就用vim
我们的vim配置都在隐藏文件.vimrc中
一般我们推荐直接一键化配置vim,不要自己去配置了,很麻烦,在Linux下输入以下命令然后输入root密码就一键配置了,大佬写好的直接用很香,安装完成后重启一下shell就好了
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
二、编译工具–gcc/g++编译器
这里只讲gcc,因为g++跟gcc指令基本差不多,而C语言作为基础语言大家更方便学习
1、程序翻译过程
c程序的翻译分为预处理、编译、汇编、链接四个部分,这里我们可以穿插新内容简单回忆一下,有兴趣大家可以看看我以前写的有关这部分的blog
预处理阶段主要就是进行宏替换,生成.i文件
编译阶段检查代码规范性、语法错误,生成.s文件
汇编阶段生成机器可识别代码,生成.o文件
链接阶段链接库文件生成可执行程序
在图片中我们可以直观的看到,test.c经过预处理后,生成test.i,文件大小变大了特别多,这就是宏替换,大量头文件的包含引入,然后经过编译,文件大小变小,然后汇编,由汇编代码生成二进制编码,大小变大,再然后就是链接库生成可执行文件
这里的库是函数库,因为像printf这样的函数,在我们的C程序中没有实现,并且在stdio.h中也只有printf的声明而没有实现,那么printf函数是在哪里实现的呢?答案就是函数库
函数库分为动态库和静态库两种,静态库在链接阶段,会将库中被程序使用的目标文件(包含函数的实现代码等)提取出来,与程序自身的目标文件组合在一起,生成最终的可执行文件,这样做的好处是,可执行文件相对独立,不依赖外部的库文件就可以运行,因为所需的库代码已经包含在其中了,坏处就是文件太大了,动态库的链接又分为加载时链接和运行时链接两种情况,但总的来说我们用一个简单的方式来理解,就是相当于在程序中放了一个链接,这里的链接就是我们平常说的地址链接,它可以找到动态库,然后在使用某个函数的时候再向外寻找,这样做的好处就是文件小,坏处就是可执行文件必须依赖外部的库文件运行,一旦该库文件消失或者换了位置,那么它就不可运行,并且其他依赖该库文件的程序也会不可运行
我们正常进行翻译的时候是动态链接的,如果需要静态链接就在后面加上-static
我们可以明显看出静态链接的文件比动态链接的文件要大100倍,但是我们发现为什么test1比test.c也大了100多倍这么多呢?其实上面所说的动态链接不是纯动态链接,而是一部分动态一部分静态,是混合的
2、动静态库注意事项
如果我们没有静态库是不能完成静态库链接操作的
如果我们没有动态库,只有静态库,我们不进行-static链接,按照默认动态链接的指令进行也是可以链接的,链接的是静态库,因为指令在默认条件下是进行动态链接的,优先搜索动态库,如果没有那就搜索静态库,如果都没有那就链接失败
在我们正常gcc test.c -o test指令下,不是纯动态链接的,而是混合的,就是有动态链接的部分,有静态链接的部分,而加上-static就是全部静态链接了
3、gcc使用
gcc [选项1] 要编译的文件 [选项2] [目标文件]
选项1 | 作用 |
---|---|
-E | 只激活预处理 |
-S | 编译到汇编语言不进行汇编和链接 |
-c | 编译到目标代码 |
选项2 | 作用 |
---|---|
-o | 文件输出到文件 |
三、多人写作开发工具–git
1、简介
git是一个开源的分布式版本控制系统,用于高效地管理软件开发过程中的代码版本,git允许开发人员将代码仓库克隆到本地,在本地进行开发、提交、推送等操作,并且可以方便地与远程仓库进行同步,每个开发者都拥有完整的代码仓库副本,包括所有的版本历史和元数据,这使得开发过程更加独立和灵活
与集中式版本控制系统不同,git没有单一的中心服务器,每个开发者的本地机器上都有一个完整的版本库,包含了所有的提交历史和版本信息。这意味着开发者可以在本地进行完整的开发流程,包括提交、暂存等操作,而无需依赖网络连接到中心服务器
git采用了一种称为 “快照” 的方式来存储版本信息,它会在每次提交时为整个项目创建一个快照,记录下所有文件的状态,同时,git使用了高效的压缩算法和数据结构来存储这些快照,大大减少了存储空间的占用,并且能够快速地进行版本的切换、合并等操作
git的分支创建和切换非常轻量级,几乎可以瞬间完成。开发者可以轻松地创建多个分支,用于不同的开发任务,如功能开发、修复 bug 等。各个分支之间相互独立,开发人员可以在不同分支上并行开发,然后根据需要将分支合并到主分支或其他分支上。
主要用于团队协作开发、代码备份与恢复、开源项目管理
2、git使用
相信大家都不陌生Github和Gitee,前者是全球最大的开源代码托管平台,后者是面向国内开发者的代码托管平台,有很多的开源项目和学习资料我们可以从中下载,我们自己也可以开源项目共其他人查看,Github作为一个外国网站,本身访问不太稳定,需要借助一定的“技术”才能使用,所以我们在这里展示一下Gitee的使用
新增仓库时下方三个按钮都是可选可不选的,一般来说,如果我们的仓库是纯某个文件的仓库,我们都会将初始化仓库中的.gitignore勾选,它的作用是将文本中有的后缀名在我们推送到远端仓库时全部默认不推送
然后就是readme文件,这个文件简单就是说明书,对于开源项目是必不可少的
通过git clone+远端仓库链接将远端仓库克隆下来
在这里创建文件,然后写文件,然后我们如果想要打包好开源到Gitee上的该仓库上我们需要先将加入待定区,使用
git add+文件名
将文件加入待定区,然后
git commit -m “备注”
允许发送到远程仓库,最后
git push
发送到远端仓库,其中要在备注中写明这个文件是啥
今日分享就到这里了~