Linux开发工具

简介: Linux开发工具

前序


这一章节学习Linux开发工具,什么是工具呢?在日常生活中工具是用来帮助解决问题的,例如,切菜用到的刀;用来喝水的杯子…


在这里工具其实是指令


生活中

如果自己想要安装某一款软件,需要先下载软件包(连网状态);软件包肯定不是在自己的手机或者电脑上面,如果是,下载岂不是多次一举,所以,软件包是在远端服务器上,或者云服务器上;既然知道软件包在服务器上,但到底在哪一台服务器上呢?如果是电脑,在官网里面搜索即可,如果是手机,在应用商店里搜索即可。


Linux客户端

在Linux中下载软件与上面类似,首先软件本身是开源,一起打包放在开源软件对应的服务器中;下载时,在Linux中寻找内置服务器中对应的下载链接也就是yum


Linux编辑器-vim使用


vim的基本概念


f88f45446ac25088e7fee20873efc3ef_eb93a38b7a144678a823c45e83547169.png


命令模式

控制屏幕光标的移动,字符,字或行的删除,移动复制某区段及进入insert mode下,或者到last line mode

插入模式

只有在insert mode下,才可以做文字输入,按Esc键可回到命令行模式

末行模式

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作;在命令模式,shift+;即可进入该模式


vim的基本操作


进入vim,在系统提示符号输入vim及文件名称后,便可进入vim全屏幕编辑画面;进入vim之后,是处于正常模式,只有切换到插入模式才能输入文字


38ef53695971a869f10e75331e52420b_452b8124609c4e2384aafdbdfc1752f9.png


正常模式切换插入模式


输入 a
输入 i
输入 o


插入模式切换正常模式

处于插入模式,就只能一直输入文字;按Esc键即可退出插入模式转到正常模式


正常模式切换末行模式

shift+;也就是输入:


退出vim及保存文件,在正常模式下,先切换到末行模式


:w 保存当前文件
:wq 输入wq,保存并退出vim
:q! 输入q! 不保存强制退出vim


vim正常模式命令集


插入模式

按[i]切换进入插入模式,按i进入插入模式后是从光标当前位置开始输入文件

按[a]进入插入模式后,是从当前光标所在位置的下一个位置开始输入文件

按[o]进入插入模式后,是插入新的一行,从行首开始输入文字

从插入模式切换命令模式

按[Esc]键

移动光标

vim可以直接在键盘上的光标上下左右移动,规定下vim是用小写英文字母[h],[j],[k],[l],分别控制光标左,下,上,右移动一格

按[G]:移动到文章的最后

按[$]:移动到光标所在行的行尾

按[^]:移动到光标所在行的行首

按[w]:光标跳到下个字的开头

按[e]:光标跳到下个字的字尾

按[b]:光标回到上个字的开头

按[#l]:光标移动到该行的第#个位置

按[gg]:进入到文本开始

按[shift+g]:进入文本末端

按[ctrl]+[b]:屏幕往后移动一页

按[ctrl]+[f]:屏幕往前移动一页

按[ctrl]+[u]:屏幕往后移动半页

按[ctrl]+[d]:屏幕往前移动半页

删除文字

x:每按一次,删除光标所在位置的一个字符

[#x]:删除光标所在位置后的#个字符

[X]:每按一次,删除光标所在位置前面的一个字符

[#X]:表示删除光标所在位置前面的#个字符

[dd]:删除光标所在行

[#dd]:从光标所在行开始删除#行

复制

[yw]:将光标所在之处到字尾的字符复制到缓冲区

[#yw]:复制#个字符到缓冲区

[yy]:复制光标所在行到缓冲区

[#yy]:拷贝从光标所在行及下面#行

[p]:将缓冲区内的字符贴到光标所在位置

所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能

替换

[r]:替换光标所在处的字符

[R]:一直替换光标所在处的字符,直到按下[Esc]键为止

撤销上一次操作

[u]:如果误操作一个命令,可以按下[u],回到上一个操作;按多次[u]可以执行多次撤销

更改

[cw]:更改光标所在处的字到字尾

[c#w]:更改#个字符

跳至指定的行

[ctrl]+[g]:列出光标所在行的行号

[#G]:表示移动到光标至文章的第#行行首


vim行末模式命令集


在使用末行模式之前,先按[Esc]键确保处于正常模式,再按[:]冒号即可进入末行模式


列出行号

[set nu]:输入[set nu]后,会在文件的每行前面列出行号

跳到文件中的某一行

[#]:[#]表示一个数字,在冒号后面输入一个数字,再按回车便会跳到该行

查找字符

[/关键字]:先按[/],再输入待查找的字符,如果第一次找到的关键字不是想要的,一直按[n]会往后寻找待查找的关键字直到找到为止

[?关键字]:先按[?],再输入待查找的字符,如果第一次找到的关键字不是想要的,一直按[n]会往前寻找待查找的关键字直到找到为止

保存文件

[w]:在冒号后输入字母[w]便可以将文件保存起来

离开vim

[q]:退出,如果无法退出,在后面加上[!]强制离开vim

[wq]:保存文件并退出


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


背景知识


编译器进行代码编译的四个步骤


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


gcc编译过程


格式:


gcc[选项]  待编译的文件 [选项][目标文件]


预处理(进行宏替换)


预处理功能主要包括宏定义,文件包含,条件编译,预处理指令是以#号开头的代码行


59bbc7a401b2c995d6e4ed6adf6092ce_accddfd51544440296374e04d8af3017.png


选项-E,作用是使gcc在预处理结束后停止编译过程

选项-o,是指目标文件

test.i是预处理之后生成的C原始程序


编译(生成汇编)


gcc检查代码的规范性,是否存在语法错误,检查无误后,gcc将代码翻译成汇编语言


bf55c912958bc65a21f64f40b7d186c4_75f869b6d6fb4fc2933e8ab0a9ecee4b.png


通过 选项-S进行查看,该选项只进行编译不进行汇编,最后生成汇编语言

test.s是编译之后生成的汇编代码


汇编(生成机器可识别代码)


将编译阶段生成的.s文件转化成目标文件


f5b9ed516b3303458b47d221b380b1e3_b37b0115b0cf492fa1f53c4ebe033d84.png


通过选项-c可以将汇编代码转化为.o的二进制目标代码

test.o是已经转化之后的二进制目标代码


链接(生成可执行文件或库文件)


f391b7e886cbe0e37e59c3db0bf6f4a2_ae04f5180647451ea12329edde690037.png


动态链接与静态链接

首先需要了解的是链接的本质:调用库函数时,实质上是在调用标准库


标准库分为两种:静态库,动态库


Linux下库的命名规则

动态库:libXXX.so;静态库:libYYY.a

去掉前缀lib,去掉后缀.so/.a便是库名称


动态库在编译链接时并没有将库文件的代码加载到可执行文件中,而是在程序执行时由运行时链接文件加载到库中,可以减少内存的开销;动态库的后缀一般是.so


gcc在编译时,默认使用动态库,完成链接之后便会生成可执行文件


1f539b417553b114f33f576138e2f3a5_6eaad755c25540be81009895918130e9.png


静态库是指编译链接时,把库文件的代码全部加载到可执行文件中,生成的文件也就比较大,但也较为方便,其后缀名一般是.a


8f6998359fb8f878a0f9121dfad4b36b_84171c93245d4a369ef04dcef7e9a8ac.png


gcc选项


-E 激活预处理,不生成文件
-S 编译到汇编语言不进行汇编和链接
-c 编译成目标代码
-o 指明形成的临时文件名称
-static 用于静态链接


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


理解


make是命令;makefile是文件

makefile的目的是为了构建项目,makefile优点是自动化编译,一旦写好,只需要make命令,整个工程便会自动编译,极大地提高效率。但需要两方面:依赖关系,依赖方法


#include<stdio.h>
 int main()
 {
    printf("hello makefile\n");                                                                                                                                             
    return 0;
 }

bcc5b8ca84652adb522428bf7157bc5e_ad9f618774c244aab2d218df31b16598.png


5d9e08c31544aaffc10de61bb764334e_361a266da5b54f8d9fdb56150e354105.png


通过make命令直接生成可执行程序code


依赖关系


code文件的生成依赖于 code.c文件


依赖方法


gcc code.c -o code


通过gcc生成 code可执行文件


清理


d2df0a418149818e63c0a4f2657b00bb_e50a4beca6eb40c48d268032ec2d9038.png

b156c11a1c6dddfe388802119e388695_e6ad440338c841ff9520170490bb9fa8.png


.PHONY修饰的对象可以一直被执行

观察下列命令


a6c28b1648b1f7dc1b265fbb256b8e1c_2c873f4a1a554b81a623ba6c2935bb8d.png


当make命令执行一次之后,再执行第二次时,程序报出此文件已是最新的,什么意思呢???而且为什么删除指令make clean为什么可以多次进行,而不会报出任何问题问题呢???想要解决这些问题,需要先了解文件的属性


1f18518aad92e3dca5063df880b5ea3b_f4a6e049b18e4547a67709d4502516e4.png


由上图可以看到Modify,Change都是表示文件的时间,到底那个是表示修改属性时间,那个内容修改时间呢?下面一起来测试一下


7e56922bf2a59b962f6028a2422a3dc5_f589917904444feabb9ad3a9f1c54b53.png


通过修改文件所有者的属性,观察到Change表示的时间发生了变化,所以:Change表示的是修改属性的时间,Modify表示的是修改内容的时间,还需要注意的是,修改文件内容一定会修改属性的,因为文件的大小也是属性,故Modify的时间发生变化,Change的时间也一定会变化,这里讨论的便是Modify表示的时间


现在回到正题,既然提到时间,那就根据时间这个信息去解决上面的问题


d9997a4bbb13d7bea0a49828d91a9289_be73fc7f355f4b6e8b50d8c2e15e3262.png


源文件的生成时间肯定比生成的可执行程序的时间要早,上面也符合这个,所以当再一次进行make指令时,报出已是最新,指的应该是生成的可执行程序的时间并没有改变,还是晚于源文件。可以猜测:是不是当源文件的时间比可执行程序的时间新时,便可再次进行make指令呢???


接下来进行验证


321e7bed57063191f88f318b9cd24876_685a58394cdc443784d25c6e754ee903.png


当对源文件进行重命名之后,Modify的时间发生了变化,导致源文件的时间比可执行程序的时间新,所以make指令便可重新执行


clean是被.PHONY所修饰的,之所以可以一直被执行,是因为被.PHONY所修饰的命令,不关注任何时间,直接无脑执行即可,至此,上面的问题已经完全解决


Linux调试器-gdb使用


背景


在Linux中通过gcc生成的可执行程序,默认是release版本。也就是不可以进行调试,只有在源代码生成可执行程序时,在makefile中加入后缀-g,生成的便是可调试版本(debug)。两个版本下大小也是有所区别的,debug版本下加入了可调式信息,大小自然也就相对大些


8258a89ba855ffa035d9c2a9ece90994_94d3a45a42644937a08ada119ef49e49.png


开始使用


断点


打断点 b 行号    形成编号
查断点 info b   观察断点
去断点 d 编号    使用编号


运行


调试运行  r 
逐过程    n
逐语句    s
运行至下个断点  c


监视


display/undisplay   显示变量
until   调试至指定行
bt      查看调用堆栈
finish  结束函数运行

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
7月前
|
NoSQL Linux 测试技术
Linux开发工具——gdb篇
Linux开发工具——gdb篇
|
7月前
|
存储 Linux 开发工具
Linux开发工具——gcc篇
Linux开发工具——gcc篇
|
7月前
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
|
6月前
|
Linux 开发工具 数据安全/隐私保护
Linux基础——Linux开发工具(下)_make/makefile
Linux基础——Linux开发工具(下)_make/makefile
49 1
|
5月前
|
NoSQL Linux 开发工具
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
|
6月前
|
NoSQL Linux 开发工具
【Linux】Linux环境基础开发工具_6
【Linux】Linux环境基础开发工具_6
41 0
|
6月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_5
【Linux】Linux环境基础开发工具_5
30 0
|
6月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_4
【Linux】Linux环境基础开发工具_4
36 0
|
6月前
|
Linux 开发工具 C语言
【Linux】Linux环境基础开发工具_3
【Linux】Linux环境基础开发工具_3
24 0
|
6月前
|
Linux Shell 开发工具
【Linux】Linux环境基础开发工具_2
【Linux】Linux环境基础开发工具_2
20 0

热门文章

最新文章