目录
前言:这一篇将会开始学习yum安装工具,以及vim开发工具等工具,学习之后,我们将可以使用Linux进行代码编写、调试等操作。
一.软件包管理器yum
1.软件安装
Linux安装软件分为3种:
①源码安装:下载到程序的源代码,并进行编译,得到可执行程序。
②rpm安装:只下载一个程序,而不包括该软件所需要的各种库,这些库需要自己安装。
前两种安装起来都很麻烦,因此有了第三种yum。
③yum安装:不用编译源码(①),也不用解决依赖关系(②)
有些人把一些常用的软件提前编译好,做成软件包放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。
2.查看软件包、lrzsz
通过yum list可以罗列出当前一共有哪些软件包,由于包的数目很多,这里需要使用grep命令来筛选我们想要的包。
yum list | grep lrzsz
lrzsz是一个用于window机器和远端的Linux机器通过XShell传输文件的工具,安装完毕之后可以通过拖拽或指令的方式传文件。
3.安装和卸载
安装:
sudo yum install lrzsz
安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.
卸载:
sudo yum remove lrzsz
二.vim编辑器
1.vim的模式
(1)正常模式
控制光标的移动,字符、字或行的删除,移动复制某区段及进入其它模式。
(2)插入模式
进行代码输入的模式,是用的最频繁的编辑模式。
(3)底行模式
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。
(4)替换模式
可以替换当前字母,进行批量化替换。
2.vim的基本操作
① 刚进入vim时,处于正常模式。
② [正常模式]切换至[插入模式]
输入i:在当前位置进入插入模式
输入a:在下一个字符位置进入插入模式
输入o:在下一行位置进入插入模式
③ [正常模式]切换至[底行模式]
shift + :
④ [正常模式]切换至[替换模式]
shift + r
就是R
⑤ [其它模式]切换至[正常模式]
按Esc键即可
⑥ 退出vim及保存文件,是在底行模式下
w(保存当前文件)
wq(保存并退出)
!q(强转退出)
!wq(强转保存并退出)
3.vim正常模式命令
① 复制、粘贴
yy:复制当前行
nyy:从当前行开始复制n行
p:粘贴在当前行的下一行
np:粘贴n个在当前行的下一行
② 剪切、删除
dd:剪切(删除)当前行
ndd:剪切(删除)从当前行开始的n行
③ 撤销操作
u:撤销刚刚的操作
shift+r:针对u操作,进行撤销
④ 光标移动到末尾行、开头行
shift+g:光标快速移动到文本末尾行
gg:光标快速移动到文本开头行
n+shift+g:光标快速定位到文本的任意一行
⑤ 光标移动到行末尾、开头
shift+4:光标快速移动到文本行末尾
shift+6:光标快速移动到文本行开头
⑥ 向后、向前以单词为单位进行光标移动
w:向后以单词为单位移动
b:向前以单词为单位移动
⑦ 上下左右移动
h:左
l:右
j:下
k:上
⑧ 大小写快速切换
shift+~:快速切换当前字符大小写
⑨ 替换、删除
r:替换光标所在字符(输入r之后再输入其它字符,会用该字符替换当前字符)
nr:替换光标所在字符后面n个
x:删除光标所在字符
nx:删除光标所在字符后面n个
4.vim底行模式命令
① 保存文件
w:输入w可以保存文件
② 退出vim
q:直接退出,若无法退出,可以加上一个 ! 强制退出
wq:退出的时候保存文件
③ 列出行号
set nu:输入后,可再每一行前面列出行号
5.vim配置
vim最开始只是像记事本一样,很难用,因此需要我们自己去配置,通过配置就可以让vim有很多功能,例如自动补齐,语法高亮,自动缩进等等。
三.gcc/g++
1.gcc/g++如何生成一个文件
gcc test.c -o mytest
通过上面的指令可以直接生成一个可执行文件mytest。
如何不加-o生成的可执行文件叫a.out,这里的-o相当于给这个可执行文件重命名。
(1)预处理
① 预处理主要包括宏定义、宏替换、包含文件、条件编译、去掉注释
② 得到预处理之后的文件:gcc -E test.c -o test.i
③ 一般把预处理之后的文件后缀加.i
(2)编译(生成汇编)
① 编译是检查代码的规范性,是否有语法错误等,检查无误后,把代码翻译为汇编语言
② 得到编译之后的文件:gcc -S test.i test.s
③ 一般把编译之后的文件后缀加.s
(3)汇编(转换为二进制代码)
① 编译是把汇编语言转换成二进制代码
② 得到汇编之后的文件:gcc -c test.s test.o
③ 一般把汇编之后的文件后缀加.o
(4)链接
① 链接是去静态库或动态库中找到对应的函数,进行链接。
② 链接之后的文件就是可执行文件,既可以通过.o文件得到:gcc test.o -o test
也可以通过.c文件直接得到:gcc test.c -o test
2.函数库
说到链接,就跟函数库有关,函数库分为静态库和动态库。
我们所实现的C程序没有定义”printf“的函数实现,并且在预处理中包含的”stdio.h“中也只有该函数的声明,而没有定义的函数的实现,那么是在哪实现类似”printf“这样的函数呢?
在linux中,这些函数被放到了libc.so.6的库文件中去了,在没有特殊指定时,gcc就会去进行查找,也就是链接到了libc.so.6的库函数中去了,这样就可以实现像”printf“这样的函数了,这就是链接的作用。
这里的函数库分为静态库和动态库。
静态库:指编译链接时,把库文件中的代码全部加入到可执行文件中,因此生成的文件比较大,但运行时就不需要库文件了。其后缀名一般为.a
动态库:与静态库相反,动态库在链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so,前面的libc.so.6就是动态库。gcc在编译时默认使用动态库。
四.gdb调试工具
1.介绍
gdb是一个调试工具。
在linux中生成的可执行文件默认是release版本,是不支持调试的,因此想要使用gdb调试,就要加上-g,让生成的可执行文件是debug版本的。
2.使用
(1)l:显示代码
(2)b:打断点
(3)d:输入断点编号,取消该断点
(4) s:step 逐语句(会进入函数)
(5) n:next 逐过程(不会进入函数)
(6)display:常显示某个变量
(7)undisplay:取消常显示
(8) p:显示一次某个变量值
(9)until:跳转到某个指定的行
(10)r:运行程序
(11)c:从一个断点跳转到另一个断点
(12)finish:执行完成一个函数后就停下来
五.Linux项目自动化构建工具make/Makefile
1.介绍
在一个工程中,源文件不计其数,要是通过我们自己挨个去gcc/g++会非常的麻烦,因此可以使用Makefile,Makefile定义一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,或者进行更复杂的功能操作。
Makefile的好处就是——自动化编译,在Makefile中写好之后,至需要一个make命令,整个工程就可以自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释Makefile中指令的命令工具。Makefile是一个文件,两个搭配使用,来完成项目自动化的构建。
2.使用
我们用一个很简单的代码作为例子。
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
我们创建一个文件test.c。
如果对test.c进行预处理、编译、汇编、链接操作就会得到test.i、test.s、test.o、可执行文件test
这里要说一下依赖关系和依赖方法:
依赖关系:
test,依赖test.o
test.o,依赖test.s
test.s,依赖test.i
test.i,依赖test.c
依赖方法:
gcc test.c -o test
Makefile文件中写:
mytest:test.c
gcc test.c -o test
.PHONY:clean
clean:
rm -f test
然后输入make命令就可以直接生成可执行文件test,输入clean就可以删掉可执行文件test。
3.make原理
① make会在当前目录下找名字为“Makefile”或“makefile”的文件
② 如果找到,它会找文件中的第一个目标文件,上面的例子是test
③ 如果test文件不存在,或者test所依赖的后面test.o的文件修改时间要比test这个文件新,那么它就会执行后面所定义的命令来生成test这个文件。
④ 如果test所依赖的文件不存在,那么make会在当前文件中找目标为test.o所依赖的文件,如果找到则根据那一个文件的规则生成test.o文件。
⑤ make会一层一层的去找文件的依赖关系,直到最终编译出第一个目标文件。
⑥ 在找寻的过程中,如果出现错误,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make不会管。
⑦ make只管文件的依赖性,如果在找了依赖关系之后,冒号后面的文件还是不再,那么make就停止运行了。
4.项目清理
工程是需要被清理的。
像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显式要make执行,即命令make clean,依次来清除所有的目标文件,以便重新编译。
但是一般clean的目标文件,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是:总是被执行的。
六.进度条
1.行缓冲区
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
sleep(3);
return 0;
}
#include <stdio.h>
int main()
{
printf("hello Makefile!");
sleep(3);
return 0;
}
这两个一个有\n,一个没有,而且结果的现象也不同,上面有\n的先打印出结果,然后等了一会。下面没有的则是先登了一会才打印出结果。这个就与缓冲区有关了。
缓冲区就是一段内存空间,遇到\n就会让数据立刻刷新出来(行刷新),如果不想用\n,也可以用fflush。
这里我们注意区分 回车和换行的区别,回车是将光标回到当前行的最开始,换行是新起一行。
回车是\r,而回车+换行是\n。
2.倒计时
这里我们先实现一个倒计时程序。
#include <stdio.h>
#include <unistd.h>
int main()
{
int cnt = 9;
while(cnt)
{
printf("%d\r", cnt--);
fflush(stdout);
sleep(1);
}
return 0;
}
这个就是靠fflush的刷新来实现。
3.进度条
然后我们再来实现进度条:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define NUM 101
#define STYLE '#'
void process()
{
char bar[NUM];
memset(bar, '\0', sizeof(bar));
const char *lable = "|/-\\";
int cnt = 0;
while(cnt <= 100)
{
printf("加载中:\033[34m%-100s\033[0m[%d%%][%c]\r", bar, cnt, lable[cnt%4]);
fflush(stdout);
bar[cnt++] = STYLE;
//bar[cnt] = '>';
usleep(200000);
}
printf("\n");
}
int main()
{
process();
return 0;
}
效果:
这里我们先给进度条预留空间,然后依次从左往右依次存入数据,并且预定好%的位置,以及后面跟随变化的数组。这里的颜色是可以随便调整的,可以上网搜索。
七.git
git:版本控制器
1.clone
git clone
作用:把远端仓库克隆到本地
2.status
git status
作用:显示本地仓库和远端仓库之间的关系
3.add
git add
作用:添加文件
4.commit
git commit -m "提交日志"
作用:将文件添加到本地仓库
5.push
git push
作用:将本地仓库代码提交到远端仓库
6.pull
git pull
作用:当前代码和远端代码不同时,无法提交,pull之后使当前代码与远端代码相同
7.log
git log
作用:查看提交日志
8.gitignore
gitignore
作用:黑名单,属于gitignore中结尾的文件不提交