目录
前言
一、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下安装软件一个通常的办法是下载到程序的源代码,进行编译得到可执行程序,但是这样过于麻烦,所以有人将常用的软件提前编译好,做成软件包,可以理解成wins上的安装程序,通过包管理器获取到编译好的软件包,直接进行安装。软件包和软件包管理器,就好比app和应用商店的关系。
yum就是linux下一种非常常用的包管理器
1.yum的一些指令
1.查看软件包
yum list | grep lrzsz
2.安装软件 yum install -y filename
3.卸载软件 yum remove filename
vi/vim的区别简单来说,都是多模式编辑器,不同的是vim是vi的升级版,vim兼容所有的vi指令
vim有很多种模式,主要介绍这三种常用的模式:命令模式、插入模式、底行模式,各个模式的功能区分如下:
a.正常/普通/命令模式
控制屏幕光标的移动,字符或者行的删除,可进入插入/底行模式
b.插入模式
只有在insert mode下,才可以做文字输入,按esc回到命令行模式
c.末行模式
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。
进入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 行行首
本文没有详细介绍vim配置,可参考其他文章
背景知识: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 hello
- gcc默认生成的二进制程序,是动态链接的,可以通过file命令验证
程序的发布方式有两种: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
一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,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
工程是需要被清理的,上述的clean,没有被第一个目标文件直接或者间接关联,那么它后面所定义的命令不会被执行,不过我们可以显示make执行,即make clean用来清除所有的目标文件,以便重新编译
\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;
}
\n带上立马刷新,但是没有\n,带上sleep休眠的时候,数据没有显示,当程序准备退出的时候才显示出来。
首先,建立一个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<=100)
{
printf("[%-100s][%d%%][%c]\r",bar,i,label[i%4]);
// -100s 左对齐 预留100个占位符
fflush(stdout);
bar[i++]=STYLE;
if(i!=100) bar[i]=[ARR];
usleep(100000);
}
//换行打印下一个
printf("\n");
}
1.安装git
yum install git
2.在gitee中进行新建仓库 初始化仓库,选择语言,gitignore都选择c++,设置模板readme,由于gitee默认不开源,要在管理中打开开源,保存设置就可以。
3.将远端仓库拉到本地,复制http,在xshell中对应的文件夹git clone + gitee地址
4.将本地仓库放到刚刚下载好的目录中 git add .
5.提交改动到本地 git commit .
提交的时候应该注明提交日志,描述详细改动的内容
6.git push同步到远端服务器上