linux入门之环境基础以及开发工具的使用(yum,vim,gcc/g++.makefile,gdb,git)

您所在的位置:网站首页 esp8266编译器找不到makefile linux入门之环境基础以及开发工具的使用(yum,vim,gcc/g++.makefile,gdb,git)

linux入门之环境基础以及开发工具的使用(yum,vim,gcc/g++.makefile,gdb,git)

2023-07-06 03:15| 来源: 网络整理| 查看: 265

文章目录

目录

前言

一、Linux软件包管理器yum

二、Linux编辑器 -vim的使用

1.vim的基本概念

2.vim的基本操作

3.vim的基本配置

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

在这里涉及到一个概念:函数库

5.Linux调试器-gdb使用

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

1.make原理

2.项目清理

7.实现linux程序 - 进度条

1.\r && \n

2.缓冲区

3.实现进度条代码,源码地址:linux: demo - Gitee.com

8.使用git命令行

 

前言

本文主要介绍了以下内容:

1.yum工具,进行软件安装

2.vim编辑器使用,学会vim的简单配置

3.gcc/g++编译器的使用,并了解原理和过程

4.简单gdb使用于调试

5.Makefile的编写,了解其运行思想

6.编写linux程序:进度条

7.学习git命令行的简单操作,将代码上传到gitee,并学会使用git管理代码版本

一、Linux软件包管理器yum

在Linux下安装软件一个通常的办法是下载到程序的源代码,进行编译得到可执行程序,但是这样过于麻烦,所以有人将常用的软件提前编译好,做成软件包,可以理解成wins上的安装程序,通过包管理器获取到编译好的软件包,直接进行安装。软件包和软件包管理器,就好比app和应用商店的关系。

yum就是linux下一种非常常用的包管理器

1.yum的一些指令

1.查看软件包

yum list | grep lrzsz

2.安装软件 yum install -y filename

3.卸载软件 yum remove filename

二、Linux编辑器 -vim的使用

vi/vim的区别简单来说,都是多模式编辑器,不同的是vim是vi的升级版,vim兼容所有的vi指令

1.vim的基本概念

vim有很多种模式,主要介绍这三种常用的模式:命令模式、插入模式、底行模式,各个模式的功能区分如下:

a.正常/普通/命令模式

控制屏幕光标的移动,字符或者行的删除,可进入插入/底行模式

b.插入模式

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

c.末行模式

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。

2.vim的基本操作

进入vim,在系统提示符号输入vim以及文件名称后就进入到vim全屏编辑画面

vim test.c

不过有一点要特别注意,就是你进入 vim 之后,是处于 [ 正常模式 ] ,你要切换到 [ 插入模式 ] 才能够输入文 字。 [ 正常模式 ] 切换至 [ 插入模式 ] 输入 a 输入 i 输入 o [ 插入模式 ] 切换至 [ 正常模式 ] 目前处于 [ 插入模式 ] ,就只能一直输入文字,如果发现输错了字 , 想用光标键往回移动,将该字删除,可 以先按一下「 ESC 」键转到 [ 正常模式 ] 再删除文字。当然,也可以直接删除。 [ 正常模式 ] 切换至 [ 末行模式 ] 「 shift + ; 」 , 其实就是输入「 : 」 退出 vim 及保存文件 , 在 [ 正常模式 ] 下,按一下「 : 」冒号键进入「 Last line mode 」 , 例如 : : w (保存当前文件) : wq ( 输入「 wq 」 , 存盘并退出 vim) : q! ( 输入 q!, 不存盘强制退出 vim) 插入模式 按「 i 」切换进入插入模式「 insert mode 」,按 “i” 进入插入模式后是从光标当前位置开始输入文件; 按「 a 」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「 o 」进入插入模式后,是插入新的一行,从行首开始输入文字。 从插入模式切换为命令模式 按「 ESC 」键。 移动光标 vim 可以直接用键盘上的光标来上下左右移动,但正规的 vim 是用小写英文字母「 h 」、「 j 」、「 k 」、 「 l 」,分别控制光标左、下、上、右移一格 按「 G 」:移动到文章的最后 按「 $ 」:移动到光标所在行的 “ 行尾 ” 按「 ^ 」:移动到光标所在行的 “ 行首 ” 按「 w 」:光标跳到下个字的开头 按「 e 」:光标跳到下个字的字尾 按「 b 」:光标回到上个字的开头 按「 #l 」:光标移到该行的第 # 个位置,如: 5l,56l 按[ gg ]:进入到文本开始 按[ shift + g ]:进入文本末端 按「 ctrl 」 + 「 b 」:屏幕往 “ 后 ” 移动一页 按「 ctrl 」 + 「 f 」:屏幕往 “ 前 ” 移动一页 按「 ctrl 」 + 「 u 」:屏幕往 “ 后 ” 移动半页 按「 ctrl 」 + 「 d 」:屏幕往 “ 前 ” 移动半页 删除文字 「 x 」:每按一次,删除光标所在位置的一个字符 「 #x 」:例如,「 6x 」表示删除光标所在位置的 “ 后面(包含自己在内) ”6 个字符 「 X 」:大写的 X ,每按一次,删除光标所在位置的 “ 前面 ” 一个字符 「 #X 」:例如,「 20X 」表示删除光标所在位置的 “ 前面 ”20 个字符 「 dd 」:删除光标所在行 「 #dd 」:从光标所在行开始删除 # 行 复制 「 yw 」:将光标所在之处到字尾的字符复制到缓冲区中。 「 #yw 」:复制 # 个字到缓冲区 「 yy 」:复制光标所在行到缓冲区。 「 #yy 」:例如,「 6yy 」表示拷贝从光标所在的该行 “ 往下数 ”6 行文字。 「p 」:将缓冲区内的字符贴到光标所在位置。注意:所有与 “y” 有关的复制命令都必须与 “p” 配合才能完 成复制与粘贴功能。 替换 「r 」:替换光标所在处的字符。 「 R 」:替换光标所到之处的字符,直到按下「 ESC 」键为止。 撤销上一次操作 「u 」:如果您误执行一个命令,可以马上按下「 u 」,回到上一个操作。按多次 “u” 可以执行多次回 复。 「 ctrl + r 」 : 撤销的恢复 更改 「 cw 」:更改光标所在处的字到字尾处 「 c#w 」:例如,「 c3w 」表示更改 3 个字 跳至指定的行 「 ctrl 」 + 「g 」列出光标所在行的行号。 「 #G 」:例如,「 15G 」,表示移动光标至文章的第 15 行行首 3.vim的基本配置

本文没有详细介绍vim配置,可参考其他文章

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

背景知识:1.预处理 2.编译(生成汇编) 3.汇编(生成机器可识别代码) 4.链接(生成可执行文件或库文件)

a.预处理(进行宏替换)

预处理功能主要包括宏定义,文件包含,条件编译,去注释等预处理指令是以#开头的代码行实例:gcc -E hello.c -o hello.i选项E,该选项的作用是让gcc在预处理结束后停止编译过程选项-o是指目标文件,i文件位已经预处理的c原始程序

b.编译(生成汇编)

在这个阶段,gcc首先要检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言用户可以使用-S选项进行查看,该选项只编译而不进行汇编,生成汇编代码实例: gcc -S hello.i -o hello.s

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

汇编阶段是把.s文件转成目标文件-c实例:gcc -c hello.s -o hello.o

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

在成功编译之后,就进入到了链接阶段实例:gcc hell.o - hello 在这里涉及到一个概念:函数库

在C程序中,没有定义printf函数实现,且在预编译中的“stdio.h"中也只有该函数声明,而没有定义函数的实现,原来在 libc.so.6的库文件中定义,在没有特别指定时,gcc会到系统默认的搜索路径"/usr/lib"下查找,也就是链接到libc.so.6库函数中,这样就实现函数printf,这也就是链接的作用。

函数库一般分为静态库和动态库两种

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件较大,但是在运行的时候不再需要库文件了,后缀一般为.a动态库是在程序执行的时候由运行时链接文件加载库,这样节省系统的开销,后缀一般为.so,gcc在编译时默认使用动态库,链接完成之后,gcc就可以生成可执行文件,gcc hello.o -o hellogcc默认生成的二进制程序,是动态链接的,可以通过file命令验证 5.Linux调试器-gdb使用

程序的发布方式有两种:debug模式和release模式,Linux gcc/g++出来的二进制程序默认是release模式,要使用gdb调试,必须在源码生成的二进制程序的时候,加上 -g选项

具体的:

list / l 行号:显示 binFile 源代码,接着上次的位置往下列,每次列 10 行。 list / l 函数名:列出某个函数的源代码。 r 或 run :运行程序。 n 或 next :单条执行。 s 或 step :进入函数调用 break(b)  行号:在某一行设置断点 break  函数名:在某个函数开头设置断点 info break :查看断点信息。 fifinish :执行到当前函数返回,然后挺下来等待命令 print(p) :打印表达式的值,通过表达式可以修改变量的值或者调用函数 p 变量:打印变量值。 set var :修改变量的值 continue( 或 c) :从当前位置开始连续而非单步执行程序 run( 或 r) :从开始连续而非单步执行程序 delete breakpoints :删除所有断点 delete breakpoints n :删除序号为 n 的断点 disable breakpoints :禁用断点 enable breakpoints :启用断点 info( 或 i) breakpoints :参看当前设置了哪些断点 display  变量名:跟踪查看一个变量,每次停下来都显示它的值 undisplay :取消对先前设置的那些变量的跟踪 until X 行号:跳至 X 行 breaktrace( 或 bt) :查看各级函数调用及参数 info ( i) locals :查看当前栈帧局部变量的值 quit :退出 gdb 6.Linux项目自动化构建工具-make/makefile

一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列规则来指定文件的编译顺序,重新编译,甚至更复杂。makefile带来的好处就是自动化编译,make指令完成整个工程的自动编译,提高了软件开发的效率。

make是一个命令工具,一个解释makefile中指令的命令工具

makefile是一个文件,里面定义编译规则

hello.c: int main() { printf("hello makefile"); return 0; } Makefile文件中: hello: hello.c //依赖方法 gcc hello -o hello.o //依赖关系 gcc -c hello.s -o hello.o gcc -S hello.i -o hello.s gcc -E hello.c -o hello.i .PHONY:clean clean: rm -f hello.i hello.s hello.o hello 1.make原理 make会在当前目录下找名字叫Makefile或makefile的文件如果找到,它会找到文件中的第一个目标文件,在上面的例子中,它会找到hello这个文件,并把这个文件作为最终的目标文件如果hello文件不存在,或者hello所依赖的后面的hello.o文件的修改文件比hello新(可以用touch测试),那么,他就会执行后面所定义的命令来生产hello这个文件如果hello所依赖的hello.o不存在,那么会找hello.o文件的依赖性(有点类似堆栈)这就是make的依赖性,make会一层一层去找文件的依赖关系,直到最终编译出第一个目标文件如果在寻找的过程中出现错误,比如最后的被依赖文件找不到,那么make就会退出或者报错make只负责文件的依赖性,即找到依赖关系后,冒号后面的文件不存在,那么就不工作啦 2.项目清理

      工程是需要被清理的,上述的clean,没有被第一个目标文件直接或者间接关联,那么它后面所定义的命令不会被执行,不过我们可以显示make执行,即make clean用来清除所有的目标文件,以便重新编译

一般我们使用clean的目标文件,将它设置为伪目标,用.PHONY修饰,伪目标的特性是,总是被执行的。 7.实现linux程序 - 进度条 1.\r && \n

\n 到下一行 换行

\r 到当前行的最开始 回车

 

#include int main() { printf("hello Makefile!"); //好像是先执行了sleep 才打印? 其实并非这样 代码是从上到下顺序执行 //fflush(stdout); //主动刷新一下缓冲区 sleep(3); return 0; } sleep的时候数据没有被刷新显示出来 字符串保存到了缓冲区,最后输出hello Makefile 加上\n 打印是缓冲区有自己的刷新规则 遇到换行符就打印出来 --行缓冲 #include int main() { printf("hello Makefile!\r"); //没有数据 因为\r是回到本行的开始 return 0; } 2.缓冲区

\n带上立马刷新,但是没有\n,带上sleep休眠的时候,数据没有显示,当程序准备退出的时候才显示出来。

3.实现进度条代码,源码地址:linux: demo - Gitee.com

首先,建立一个mkdir process文件夹,在这个文件夹里分别touch proc.h;proc.c;main.c程序,具体的程序编辑如下:

proc.h: #pragma once #include extern void process(); //声明这个函数 proc.c: #include "proc.h" #include #include #define SIZE 102 #define STYLE '#' #define ARR '>' //显示并覆盖的方案 void process() { const char * label = '"/|-\\"; char bar[SIZE]; //定义进度条的大小 memset(bar,'\0\,sizeof(bar)); //初始化都为\0 int i = 0; while(i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3