Linux : Linux环境开发工具vim / gcc / makefile / gdb / git的使用

Linux环境开发工具的使用

一、操作系统的生态

学习linux,我们怎么衡量一个操作系统的好坏呢。操作系统的发展日新月异,过去的时间里诞生了很多操作系统。如今我们使用的centos, ubnutu或者像kali这样的操作系统都是大浪淘沙留下来的,都是基于linux开发。因此他们的差异不是来源于技术,而是来源于我们下面提到的生态。

  • 操作系统本身的质量: 首先一个操作系统要想得到发行推广,其本身的质量是根本保障。
  • 社区论坛: 如果一个操作系统是大公司使用,用户都是工程师、程序员,那么社区论坛肯定比较活跃,如果有问题上传论坛,就能及时的解答,因为别人在以后的工作中可能也会遇到。
  • 官方文档: 可以及时解决当下可能遇到的问题。
  • 更新速度: 一般来说,更新时间的快慢各有好处,更新的慢可以用来教学,更新的快可商用。

二、程序下载安装

(一)程序安装方式

linux中,一般来说有三种安装应用的方式。

  • 源代码:方式比较复制,可能需要配置文件或者需要其它的依赖程序。
  • rpm包:有时候需要其他的依赖程序
  • 包管理器安装:我们常用的安装方式使用这种方式,它可以把依赖程序一起安装。

(二)包管理器 yum / apt 运行原理

1、运行原理:

在这个流程中出现几个问题

  • 程序员为什么要主动开发: 一般来说有两类人会解决这个问题,首先就是"志愿者"纯粹的乐于助人,其次是操作系统的创造者,他们想要自己的操作系统有竞争力,就要不断地创作生产。
  • 发布后为什么操作系统公司会去生成软件包: 为了保持自己公司的竞争力,不被淘汰。
  • 上线后软件包用到的服务器谁提供: 市场中的大公司需求比较大的,他们会出钱提供服务器,一两万的服务器还不是手到擒来。
  • 用到的软件包在国外怎么解决下载速度: 因为操作系统的公司在国外,而受到墙的约束下载速度就会很慢,此时国内的公司就会提供镜像站,本质是将软件包拷贝了一份在镜像站里面。

2、yum 源:

yum 源是指我们使用yum时获取程序的地址,下面的指令中便是CentOS存放软件源的路径。

在上面的yum源中,最核心的是CentOS-Base.repo,打开后可以发现它的地址,一般都是国内的镜像站。

软件包在刚上线时肯定是不稳定的,因此我们有扩展软件源,等到时间的检验后才会将它放在稳定软件源里面。

三、文本编辑器 vim

(一)认识vim 下的操作模式

linux环境下,我们我们编写代码的工具是vim,这里我们经常使用的有三种模式分别是命令模式、插入模式和底行模式

  • 命令模式
    控制屏幕光标的移动,各种修改很多便捷方式。
  • 插入模式
    进行代码的编写,文本的修改。
  • 底行模式
    文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。

(二)命令模式常用的快捷键

1、移动光标

  • vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
  • 按「G」:移动到文章的最后
  • 按「 $ 」:移动到光标所在行的"行尾"
  • 按「^」:移动到光标所在行的"行首"
  • 按「w」:光标跳到下个字的开头
  • 按「e」:光标跳到下个字的字尾
  • 按「b」:光标回到上个字的开头
  • 按「#l」:光标移到该行的第#个位置,如:5l,56l
  • 按[gg]:进入到文本开始
  • 按[shift+g]:进入文本末端
  • 按「ctrl」+「b」:屏幕往"后"移动一页
  • 按「ctrl」+「f」:屏幕往"前"移动一页
  • 按「ctrl」+「u」:屏幕往"后"移动半页
  • 按「ctrl」+「d」:屏幕往"前"移动半页

2、删除内容

  • 「x」:每按一次,删除光标所在位置的一个字符
  • 「#x」:例如,「6x」表示删除光标所在位置的"后面(包含自己在内)"6个字符
  • 「X」:大写的X,每按一次,删除光标所在位置的"前面"一个字符
  • 「#X」:例如,「20X」表示删除光标所在位置的"前面"20个字符
  • 「dd」:删除光标所在行
  • 「#dd」:从光标所在行开始删除#行

3、复制粘贴

  • 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
  • 「#yw」:复制#个字到缓冲区
  • 「yy」:复制光标所在行到缓冲区。
  • 「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。
  • 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完
    成复制与粘贴功能。

4、 替换 / 撤销

  • 「r」:替换光标所在处的字符。
    比特就业课
  • 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。撤销上一次操作
  • 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回
    复。
  • 「ctrl + r」: 撤销的恢复

(三)vim插件配置

四、gcc 编译器的使用

(一)编译器的四个阶段

1、预处理:

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

通常情况下,条件编译的作用是是将应用划分成不同的版本。

2、编译:

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,在检查无误后,gcc 把代码翻译成汇编语言。

用户可以使用"-S"选项来进行查看,生成汇编代码。

3、汇编:

汇编阶段是把编译阶段生成文件转化为".s"的二进制目标代码。

二进制编译器 & 编译器的自举:

起初是没有汇编语言所写的编译器,后来通过编译器的自举生成汇编语言所写编辑器,那为什么后来的语言不分别来一个自举呢?因为汇编语言所写的就够用了,直接转换为汇编语言相当于站在巨人的肩膀上!

4、链接:

在成功编译之后,就进入了链接阶段,此时我们需要进行链接,直接使用gcc + XX.o

(二)动态链接和静态链接

1、动态库和静态库

引入:

我们的C程序没有定义printf的函数实现,预处理中包含的stdio.h中也只有该函数的声明,而没有定义函数的实现,那么程序是怎么跑起来的?
答案是:

系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径/usr/lib下进行查找,也就是链接到 libc.so.6库函数,而这也就是链接的作用。

函数库分为两种,动态库和静态库。

  • 静态库 是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大。其后缀名一般为.a.
  • 动态库 由程序运行时,链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so.

2、动态链接和静态链接

动态链接:

在形成.o文件后,默认通过gcc动态链接动态库生成可执行程序,如果后面动态库被删除了,此时程序就不能执行。

观察我们生成的动态链接可执行程序,发现系统中确实存在这个动态链接库,链接时通过后面的地址找到相应的函数。

使用指令file可以发现这里用到的是动态链接。

静态链接:

在链接时加入-static那么链接时就是静态链接,此时得到的文件内存上远远大于动态链接,但是好处是程序和库分离,这意味着删除库文件程序还能跑。

此时再使用ldd发现程序已经不是动态程序。

五、makeflie 自动化构建

(一)基本概念

写makefile是具备完成大型工程的能力的基础,一个工程中的源文件不数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是自动化编译

make是一个命令工具,是一个解释makefile中指令的命令工具,makefile是一个文件,两个搭配使用,完成项目自动化构建

(二)使用方式

1、创建makefile语法

  • (1)依赖关系和依赖方法:

    打开文件后第一行中是依赖关系,前者是需要生成的目标文件,后者是依赖文件,因此在依赖方法中会用后者生成前者。

    当依赖关系只是一个目标文件的时候,它的作用类似一条指令。

  • (2)make执行方向:
    make会自顶向下扫描,默认生成第一个目标文件,如果指定生成,使用make mytest也能够完成。
    如果依赖文件不存在,那么makefile会自动向后面推导,他回去找生成依赖文件的其它语句,这个推导的过程类似一个栈。

  • (3)伪目标PHONY:

    如果我们的文件在进行编译一次之后,后面如果没有修改过源代码,那么再次编译时就不会成功。这是因为如果我们要编译大批代码,如果我们只修改其中的一部分,如果重新编译时每一个代码都重新进行编译,速度就会很慢,因此系统的这个方式起到提高效率的作用。

    如果我们在依赖关系的上面添加PHONY后,后面再次编译就能通过。

PHONY原理:系统通过判断源文件和可执行程序的修改时间,判断是否需要重新编译,而PHONY的作用是这个时间忽视。

ACM时间:

  • 其中,当我们修改文件的内容后,它的文笔内容修改时间Modify和文本属性修改时间Change时间都会改变,因为改变文件后,通常会影响文件的属性,例如大小。
  • Access时间指的是打开文件的时间,通常访问几次文件才做更改。

2、创建一个通用性更强的makefile

在前面的makefile的创建中,还是少了很多通用性,看不出明显的效率升级,下面我们创建的makefile可以编译当前目录的所有.c文件。

六、gdb 调试器

(一)release 和 debug

在我们使用gcc生成可执行程序时,可以生成两种版本的可执行程序。其中如果我们需要对代码进行调试或者测试,使用的是debug版本,因为gdb只能对这个版本进行调试。

观察这两个版本,可以发现debug内存信息相比于release较大

(二)gdb 的使用

linux下编程本质和曾经在vs编程功能差不多,下面我们学习的一些指令其实对应了这些在vs调试的功能。

  • list / l (行号/函数名): 显示源代码,接着上次的位置往下列,每次列10行

  • run / r: 运行程序。

  • next / n: 逐过程执行。

  • step / s: 逐语句执行。

  • break / b + (行号 / 函数名): 在指定位置设置断点。

  • info break : 查看断点信息。

  • finish: 跳出当前函数。

  • p 变量: 打印变量值。

  • set var: 修改变量的值。

  • continue / c: 跳跃到下一个断点位置。

  • delete breakpoints: 删除所有断点

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

  • disable breakpoints: 禁用断点

  • enable breakpoints: 启用断点

linux下的断点也是可以禁用的,禁用后使用continue将不会在断点处停下来。

其中,Enb指的就是断点是否被启用。

  • display 变量名: 跟踪查看一个变量,每次停下来都显示它的值
  • undisplay: 取消对先前设置的那些变量的跟踪
  • until X行号: 跳至X行
  • breaktrace(或bt): 查看各级函数调用及参数
  • info / i + locals: 查看当前栈帧局部变量的值
  • quit: 退出gdb

(三)优化使用

使用gdb还是有点不太友好,有没有简单好用一点的gdb推荐一下呢?有的兄弟!有的!使用cgdb可以使得我们在查看代码页面的同时还能看到我们调试命令栏。

七、git 版本控制器

git是一个去中心化,分布式的版本控制器。它既是一个本地windows下的软件,也是一个linux下的服务器。使用git,可以使得我们达到团队协作开发的效果,同时也可以使得数据更加安全不易丢失。

git在提交时,只会提交更改的部分,他会用字符串记录下更改操作,后续想要撤销直接对字符串操作即可。

(一)基本使用方法

  • git clone:

    将我们建立在git的仓库克隆到本地,我们可以在本地对仓库进行修改。

    这样以来,本地就创建了这样一个文件夹test_bank

  • git add:

    在本地做出修改之后,我们需要使用git add将修改的文件添加到缓冲区,此时还没有完成提交。

    可以看到,我们在使用git add之后,再使用命令git status发现文件被滞留在了一个缓冲区的位置.

  • git commit:

    使用git commit才是彻底的完成了提交,此时我们在本地提交已经完成。

    这里一定要有-m选项并介绍一下修改的内容,这样别人才能知道你干了什么,在团队协作时尤其重要。

  • git push:

    将远程和本地进行同步,此时远程仓库将会做出对应的修改。

    在完成最后一步后,远程仓库才能正式的同步到我们本地的仓库。

  • git pull:

    在多人协助开发时,可能我们的远程仓库已经被别人修改了,我们在提交时需要进行git pull同步一下远程仓库,再决定要不要提交修改。

(二).gitignore 文件

在我们的仓库列表中,存在一个隐藏文件gitignore,里面储存了很多种类型的文件的后缀,我们在将文件添加到缓冲区这个过程中带有这些后缀的文件将不被添加。

如果我们单单创建了一个文件夹,也不能够添加上去。

相关推荐
极客代码5 小时前
Git 实用性超强汇总:从入门到精通
git·版本管理·代码管理
hero_th7 小时前
[Git] git cherry-pick
git·git cherry-pick
MonkeyKing_sunyuhua9 小时前
在 Ubuntu 22.04 上从 Wayland 切换到 X11的详细步骤
linux·运维·ubuntu
xchenhao9 小时前
Linux 环境(Ubuntu)部署 Hadoop 环境
大数据·linux·hadoop·ubuntu·hdfs·环境·dfs
小兵张健10 小时前
记一个 IDEA 关于 Git 的神坑
git·后端·intellij idea
Mr.Wang80910 小时前
git的rebase和merge的区别?
git
运维&陈同学11 小时前
【Logstash02】企业级日志分析系统ELK之Logstash 输入 Input 插件
linux·运维·elk·elasticsearch·云原生·自动化·logstash
dessler11 小时前
Docker-网络&跨主机通信
linux·运维·docker
谢斯12 小时前
【Git】问题汇总
git