一、vim 编辑器(只能写代码)
1、只关注如何写代码,不会关注代码的正确性;
2、一般写代码在Windows环境下写,而vim是Linux下相对来说功能最强的编辑器;
二、vim的操作
vim ---打开vim
shift键 加 ;键 --- 输入q 退出vim
1、vim基础模式切换
在使用vim打开文件时 默认的打开模式是命令模式;
此时,输入i 可以开始进行编辑/插入模式(insert),退回命令模式按 Esc 键;
退出需要在底行模式操作 shift 键 加 ;键(也就是:)
q 表示退出;wq表示保存并退出;w!或者q!表示强制退出;按Esc回退到命令模式;
注:插入模式不能直接进入底行模式;底行模式也不能直接进入插入模式;
2、vim的常见命令
编辑模式
yy:将当前光标所在的行复制;nyy从光标所在行为第一行,向下复制n行;
p:将复制行进行粘贴;np粘贴n次;
dd:将当前光标所在的行进行剪切(删除);ndd:删除n行;
u:撤销历史操作;
ctrl + r:撤销u操作;
shift + g:光标定位到文件的结尾处;
gg:光标直接定位到文件的最开始;
n + shift + g:将光标定位到文件的第n行;
shift + ^ :将光标定位到当前行的最开始;
shift + $ :将光标定位到当前行的最结尾;
w,b:以单词为单位进行光标的前后移动;
h、j、k、l:左、下、上、右 光标进行移动;
注:尽量使用hjkl移动,因为有些指令不支持上下左右的方向按键;
老式键盘没有上下左右键;
shift + ~:大小写切换;
shift + r :进入替换模式;
r:替换光标所在的字符,也支持nr ,提换n个字符;
x /shift + x:删除光标所在的字符,向后删/向前删;支持nx;
底行模式
set nu :调出行号;
set nonu :取消行号;
vs 文件名:分屏操作;
w:写入(保存);
q:退出;
! 命令:不退出vim直接执行命令;(执行命令、编译、查看、man手册等);
vim 没有的文件名:退出时wq,可以创建文件;
3、vim需要进行配置
vim配置方法可直接搜索进行配置;
简便方法,在Gitee直接搜索VimForCpp 将链接复制到命令行进行下载即可自动完成配置;
注:一般在配置时,是配置到自己的用户下;
使用普通用户执行命令sudo sl -al时会出现报错,提示不在sudoers文件中?
解决办法:在root用户下输入命令 vim /etc/sudoers,进入后将光标指向大概104行左右,赋值wheel行,并将wheel改为普通用户名即可。
三、gcc和g++
1、程序翻译的过程
预处理:去注释;宏替换;头文件展开;条件编译;
编译:把c语言编译成汇编语言;
汇编:将汇编语言转换为可重定向二进制目标文件;
链接:将多个.o或.obj文件合并形成一个可执行文件;
2、gcc只能编译C语言,g++可以编译C语言和C++;
3、命令 gcc -v 或 g++ -v 可以查看对应的版本;
4、那么gcc或g++的编译链接等过程也是这样的吗?
答:
命令:gcc myfile.c -o mytest 或者 gcc -o myfile myfile.c
命令:gcc -E myfile.c -o myfile.i 其中-E 表示从现在开始程序的翻译,如果预处理完成,就停下来;通过此命令将预处理之后的结果保存到文件myfile.i文件中;
命令:gcc -S myfile.i -o myfile.s 其中-S 表示从现在开始程序的翻译,如果编译完成,就停下来;将汇编语言存入.s文件;
命令:gcc -c myfile.s -o myfile.o 其中-S 表示从现在开始程序的翻译,如果汇编完成,就停下来;将二进制存入.o文件,生成可重定位目标二进制文件;
命令:gcc myfile.o -o myfile 链接操作
一般链接的过程有两种方式:
动态链接-需要动态库
静态链接-需要静态库
在Linux中 .so 为动态库 .a 是静态库
在Windows中 .dll 是动态库 .lib是静态库
gcc和g++的默认是动态链接;
命令:gcc myfile.o -o myfile -static 使用静态链接的方法形成可执行程序;
注:机器上可能因为没有静态库而导致连接失败
如果没有使用命令:sudo yum install -y glibc-static c静态库
sudo yum install -y libstdc++-static c++静态库
安装。
四、make和makefile
make是一个命令;
makefile是一个文件;可以帮助我们自动构建项目;
1、Makefile文件的编写
myfile:myfile.c
gcc myfile.c -o myfile
.PHONY:clean
clean:
rm -f myfile
输入命令make 直接执行Makefile文件中的命令; 其中.PHONY在Makefile中类似于关键字,此处表明clean是一个伪目标;
注:如果命令行只输入make时,会自顶向下扫描,先执行第一个命令。
伪目标的意思就是总是被执行的,例如上边的make后myfile不会再执行了,但是一直make clean 却可以一直执行。
五、文件的时间
如上注中所述,如果不是伪目标文件在执行过一次后就不会再执行了,但是修改文件内容后Makefile就可以再次执行(即对原文件修改后可以使用make命令,如果没有修改则不能使用),那么Makefile是怎么知道文件是最新修改状态还是未修改状态?
答:根据文件的修改时间来判断;
使用命令 stat myfile 可以查看myfile的三个时间access、modify、change三个时间;
Access:最近的访问时间;
Modify:修改(内容的改变)时间;
Change:属性(如文件的权限)的变化时间;
注: 在对文件内容修改时,文件的属性也会改变,最直观的就是文件的大小;
在短时间内对文件进行多次读取访问时,Assess时间并不会频繁的发生变化,因为读取文件是一个高频得操作,即意味着Access时间会被高频的修改,但是高频的读取文件并修改时间会导致高频的访问磁盘,就会大大降低工作效率。所以目前版本的Linux对此进行优化,累积到一定时间后才进行Access时间的修改。
那么继续回到上边的问题,是否可以执行make命令主要看原文件与可执行程序的Modify时间,如果原文件的时间比可执行程序的时间晚,那么可以使用make命令;
六、多文件的makefile文件的编写
touch test.h
touch test.c
touch main.c
test.h
#pragma once #include
extern void show() test.c
#include "test.h" void show() { printf("hello test!\n"); }
main.c
#include "test.h" int main() { show(); return 0; }
Makefile
mytest:test.o main.o gcc -o mytest test.o main.o //此时Makefile如果找不到test.o和main.o,将会继续向下扫描 test.o:test.c gcc -c test.c -o test.o main.o:main.c gcc -c main.c -o main.o .PHONY:clean clean: rm -f *.o mytest //*.o 指所有的.o 文件
七、Linux小程序---进度条
背景知识1、缓冲区
#include
#include int main() { printf("hello world\n"); sleep(3); return 0; } 此代码在运行时会先打印出 hello world,然后执行sleep动作,而把 \n 删除后结果却是先执行sleep动作,再打印 hello world。原因是,printf已经执行完了,只是信息没有被立刻显示出来!C语言会提供输出缓冲区,根据特定的刷新策略来进行刷新。C语言将printf内容先写到缓冲区,然后在相缓冲取的内容刷新到硬件中。而显示器设备一般的刷新策略是行刷新(碰到\n,就将\n之前的字符全部显示出来);
解决方法:使用 fflush 函数进行刷新;
#include
#include int main() { printf("hello world"); fflush(stdout); sleep(3); return 0; } 背景知识2、回车换行
回车\r、换行\n不是一个概念,回车是回到此行的最开始,换行是垂直向下移动一行;目前编译器默认\n 是回车和换行。
进度条代码
#include
#include #include #define NUM 102 //0到100 有101个数据,最后是字符串还会有\0 int main() { char bar[NUM]; memset(bar,0,sizeof(bar)); const char *lable="|/-\\"; //闪动光标 int cnt = 0; while(cnt<=100) { //\r和fflush可以让多行数据在一行刷新打印出来,而%-100 为在每次打印字符s时,在后边预留空 //白;%d%%的两个%,打印出来时一个% printf("[%-100s][%d%%] %c\r",bar,cnt,lable[cnt%4]); bar[cnt++]='#'; fflush(stdout); usleep(30000); } printf("\n"); return 0; }
八、软件包管理器yum
yum是在centos版本上使用的,Ubuntu使用的是apt get;
1、在Linux中的yum就相当于手机中的应用市场,yum知道下载对应文件所在的服务器位置,yum可以帮助用户搜索、下载、安装软件,并且解决依赖关系;软件的发布平台一般都是国外的,由于有墙的原因,所以国内有很多镜像网站,将国外的软件发布平台镜像;而Linux的原生系统内置的下载链接一般都是国外的网址。
2、yum的基本知识
yum使用Python写的一个小程序;
yum源:是一个配置文件,使用命令:ls /etc/yum.repos.d 查看配置文件,配置文件中就是一个一个链接;
命令:sudo yum install -y epel-release 安装拓展源,可以下载一些官方中没有的程序;
3、yum的操作
命令:yum list
将可以下载的软件全部显示出来;
例如:如果想找一个名字里有 sl 的文件,使用命令:yum list | grep sl 可以查找出所有与名字中含有sl的可下载软件;
命令:yum install sl 一般安装软件需要root权限,所以一般在前边加sudo;
命令:sudo yum install sl 此时会询问是否安装 y或n,在sl前加一个-y即可全部同意,即
命令:sudo yum install -y sl
命令:sudo yum remove sl 移除软件;由于是sudo安装的,所以需要用sudo卸载,也可以加-y选项;
注:yum在安装软件时,如果软件需要以来一些库等,那么yum会自动下载这些依赖条件。
九、git
1、什么是版本控制?
例如:第一个版本需要修改,但是先把第一个版本保存出一个副本,然后在副本上修改生成第二个版本;这样原始版本和新的版本都会存在,这就叫做版本控制;如果想通过写代码完成上边的过程,这个程序就叫做版本控制器;(如git、svn)
2、git的历史?
最初在开源linux时,雷纳斯托瓦兹需要自己维护,将别人提出的建议修改到对应的模块但是修改量太庞大难以人工维持,而最初有一个收费的版本控制器软件,软件的老板给linux免费使用,但是linux社区的一些程序员尝试破解这款对其他人收费的软件,故停止了对linux社区的免费使用权,于是雷纳斯托瓦兹自己写了一个版本控制器,并将其命名为git并且开源;
3、git的简单操作?
新建仓库:
在gitee建好仓库后,复制链接,linux中使用命令:git clone 链接 输入gitee的账号和密码;
将代码添加到本地仓库:
命令:git add .
将代码提交修改到仓库中
命令:git commit -m "这里需要写提交日志" 需要写本次提交的改动或一些必要细节;
上传代码
命令:git push 输入账号和密码即可将代码提交;
其他情况:
可能第一次使用需要配置用户名和邮箱;使用命令 git log可以查看提交记录;
可能出现提交冲突的问题;使用命令: git pull将本地仓库和远端仓库同步一下,即可成功提交;
.gitignore,如果不想提交某些后缀的文件同步到远端仓库中,就可以添加到.gitignore,使用命令:vim .gitignore 打开后在里面添加不想上传的后缀;
git rm 可以删除;
十、gdb的使用
1、背景认识
gcc和g++默认形成的可执行程序时release的,所以无法直接调试;在gcc的命令之后加-debug -g即可按照debug方式发布;例:命令 gcc myfile.c -o myfile-debug -g
2、gdb操作
命令:gdb 可执行程序名称
quit:退出gdb;
gdb会记录最近一条吗命令,如果命令不变化,可以直接回车;
list/l:显示代码,如果后边不跟其他命令,只显示部分代码;也可以使用 l 显示代码,l 0 表示从第一行开始显示;
run/r:开始调试,如果没有设置断点,直接运行结束;
breakpoint/b 行号:在指定行号打断点;
info b :查看断点;
d NUM编号:删掉指定编号的断点;(注意此处的NUM编号是使用info查看显示的编号,不是行号);
next/n:逐过程调试;相当于vs中的F10;
p 变量名:打印变量的内容;
step/s:逐语句调试:相当于vs中的F11;
bt:查看当前的调用堆栈;
finish:将当前函数跑完就停下来;
display 变量名:长显示变量;
undisplay 变量编号:取消长显示;
until 行号:跳转到指定行,一般在函数内对函数进行局部操作;
continue/c:运行至下一个断点处停下来;
disable/enable:使能(关闭或打开)断点;