3.底行替换
将要替换的命令替换为替换后的命令。
%/需要替换的命令/替换后的命令/g
4.保存和退出文件
wq
单独的w是保存文件,单独的q是退出文件,两个一起是保存并退出文件。
如果文件提示无法退出,可以在q之前加上!,强制退出。
3.vim的配置
没有进行配置的vim和记事本没有多大区别比较难使用,为了方便使用,我们要对vim进配置。
注意:vim的配置是一人一份的并不会互相影响,虽然大家用的是一个vim运行程序,但是大家的vim配置不同(每个成员在自己的家目录下有属于自己的vim配置)。
vim的配置是在家目录下的.vimrc
文件中,可以在该文件中添加一系列的命令。因此vim的配置其实就是修改.vimrc
文件。
三、gcc/g++(编译器)
1.编译链接的过程
在正式介绍编译器之前,我们先回顾一下编译链接的过程。
2.gcc/g++的使用
1.预处理
头文件展开、宏替换、条件编译、去掉注释。
gcc -E test.c -o test.i
从现在开始进行程序的翻译,直到预处理结束停下。
头文件展开:
去掉注释:
2.编译
检查代码的规范性,以及是否存在语法错误等,确定无误后将代码编译为汇编语言。
gcc -S test.i -o test.s
从现在开始,进程程序的翻译工作,直到编译结束文件变成汇编后,就停下来。
3.汇编
将汇编语言转换为二进制语言(并非可执行程序,是二进制目标文件)
gcc -c test.s -o test.o
从现在开始,进行程序的翻译工作,做完汇编工作后,变成可重定向目标二进制文件,就停下来。
可以发现我们看不懂这些乱码,但是用命令od test.o
就可以将它转化为我们可以看懂的01二进制文件
4.链接
链接的过程就是,将目标文件与标准库链接起来,形成一个可执行程序的过程。
gcc test.o -o test
链接的过程形成了可执行程序(test是我们自定义的可执行程序文件名,可以进行修改)
可以看到整个过程形成的所有的文件:
3.函数库
1.库函数
我们自己写的代码和库是两码事,我们自己写的程序中没有定义printf
等函数的具体实现,且在预编译中包含的stdio.h
中也只有这些函数的声明,只有在链接的时候该函数的实现才与我们的代码关联起来,那么这类函数是在哪里实现的呢?
答:这类函数都被实现到文件名为libc.so.6
的文件中,在没有特别指向时,gcc会到系统默认的搜索路径/usi/lib
下进行寻找。即,链接到libc.so.6库函数中去,这也是链接的作用,将库函数的实现与库函数的声明关联起来。
查看该文件:
ls /lib64/libc.so.6 -l
2.为什么要存在数据库?
为了让我们站在巨人的肩膀上,减少我们的开发成本。
4.静态链接和动态链接
gcc meytest.c -o mytest.s
Linux下形成一个可执行文件使用的链接默认是动态链接。如果要求是静态链接,就必须在命令尾部加上 -static,如下:
gcc meytest.c -o mytest.s -static
1.动态链接
1.用一个小故事理解动态链接
从前,在XXX学校,有一个叫张三的学生,他每天的生活都很自律。每天都会严格执行自己的计划清单,清单内容:数学、语文、英语、上网、复习。他住在学校的宿舍里,身边有数学、语文、英语的学习资料,但是没有上网的工具。为了顺利执行计划,张三询问他的学长,学校附近是否存在网吧,学长告诉张三,出了学校北门往东走500米左右就到XXX网吧。因此张三先执行学习数学、语文、英语的计划,然后按照学长给他的地址到达XXX网吧进行上网,然后再回来复习今天的内容。
上面的故事可以参考下图进行理解。
如果将张三比作程序,则张三每日执行的计划清单就是程序员所写的代码,而其中上网这一项,则是程序要调用库函数。程序跳转到函数库中执行所需的库函数,执行完毕后再回到代码中继续向后执行。(这种调用库函数的方法称为动态链接)
2.问题
- 如果网吧升级或者被关闭会影响张三上网吗?
会影响的,如果网吧要升级,它必然一段时间不开门,导致张三无法上网。更不用说是被关闭。 - 这样做耗费张三的时间吗?
当然耗费,张三前往网吧上网,以及上网结束回到学校都要耗费时间的。
3.优点
动态链接形成的可执行的程序小。
节省资源——内存、磁盘。
方便下载。
4.缺点
受库的升级或者被删除的影响。
2.静态链接
1.用一个小故事理解静态链接
前几日由于受到学校的举报,学校附近的网吧都被关闭了。好在,张三的父母比较开明,也很信任自己的孩子,就给张三买下了张三常在网吧中学习的那台机子。在这之后,张三执行每日计划就不需要跑去外面的网吧,他在宿舍中就可以执行上网这一项内容,然后正常执行每日计划。
程序将所需的库函数从函数库中拷贝了一份,然后就不需要再进行跳转到函数库中执行库函数了。(这种调用库函数的方法称为静态链接)
2.问题
- 如果网吧升级或者被关闭会影响张三上网吗?
不影响,此时张三所需要进行上网的工具电脑,已经在张三身边,因此无论是网吧升级导致定制营业还是网吧彻底关闭都不会影响张三上网。 - 这样做耗费张三的时间吗?
不耗费,电脑就在张三手边,和张三的语文英语等学习资料一样需要就可以拿来用,不需要在路上耗费时间。
3.优点
不受库的升级或者被删除的影响。
4.缺点
形成的可执行程序体积太大。——网络、磁盘、内存。
同一个库函数可能会有多个C程序调用,此时使用静态链接就会导致代码冗余的问题。
5.静态链接拷贝的是.so内部的代码吗?
不是,如果要静态链接的话,系统中必须存在.a结尾的静态库。因为,动态链接找动态库,静态链接找静态库。