
各位读者大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页: 落羽的落羽
之前学习C/C++时我使用的VS2022,是一个IDE集成环境,包含了编辑、调试、编译、运行一系列功能。但在Linux环境下,这一过程的每一步其实是分开独自进行的。其中Linux中最常用的代码编辑器,就是vim。

vim有很多种模式,我们最常用的三种是命令模式(command mode)、插入模式(insert mode)、底行模式(last line mode),一会后面还会了解几种模式。vim中不同模式之间的切换,一般是通过特定的快捷键完成的。
用vim打开一个文件进行编辑,使用指令vim 文件名即可,若该文件不存在则会自动创建。
用vim打开一个文件,就是这样的很简洁的页面,此时写代码并没有什么语法提醒、自动补全的功能。

想要给vim增加更丰富的界面功能等,需要我们自己对vim进行简单配置。
在每个用户是主目录下,都可以建立私有的配置文件,这个文件名字是.vimrc。对vim做基本配置,本质是把配置项写进/home/XXX/.vimrc中。
具体的常用配置项可以自己写入文件中。也可以安装互联网上他人开源的已经配置好的插件,这里给大家推荐一个:https://gitee.com/HGtz2222/VimForCpp
目前只支持CentOS系统,不支持在root账号下安装,只能在普通用户下安装。

输入这一串指令 安装好以后,再使用vim打开文件进行编辑,页面功能就更加丰富好用了。

命令模式是所有模式之间切换的“中转站”,一开始用vim打开文件时默认处在命令模式,然后可以通过特定命令进入其他模式。在其他模式之间的切换,一般要先回退到命令模式中,再切换到另一种模式。从其他模式进入命令模式,按Esc键。
ZZ(也就是shift+zz,下同):退出vimh、j、k、l分别控制光标左、下、上、右移动一格。G:移动到文章的最末端,前可加数字表示进入哪一行gg:移动到文章的最开始$:光标移动到所在行的行尾^:光标移动到所在行的行首w(b):光标移动到下个(上个)单词的开头,前可加数字表示跳过几个单词x:删除光标所在的一个字符,前可加数字表示删除包含自己的后面几个字符X:删除光标所在位置的前面一个字符,前可加数字表示删除不包含自己的前面几个字符dd:删除光标所在行,前可加数字表示删除下面几行yy: 复制光标所在行,前可加数字表示复制下面几行dd:剪切光标所在行,前可加数字表示剪切下面几行(不搭配粘贴使用就是删除)p:将缓冲区的内容粘贴到光标所在位置,前可带数字表示粘出几份r+ 新字符:替换光标所在处的字符,前可加数字表示批量替换R:进入vim的替换模式,此时输入字符就是替换光标处内容,直到按Esc回退到命令模式~:字母转换大小写,前可加数字表示转换后面几个字符(如果是字母则转换)u:撤销上一个操作,可以连续执行撤销多次操作(只要没有退出vim,随时可以进行撤销,文件保存后也能)ctrl+r:撤回刚才的撤销操作ctrl+v,进入vim的视图模式,这种模式下可以通过hjkl键选择想要添加注释的文本区域,然后按I,输入//,按Esc,这篇区域就都添加了//。这种方法也可以批量输入其他文本内容。在命令模式下,按i进入插入模式并且光标是当前位置,按a进入插入模式且光标处于下一个位置,按o进入插入模式且光标处于新建一行的行首。
然后,就可以在插入模式下随心所欲写代码了~
在命令模式下,按:进入底行模式。
w,表示保存当前文件(保存就是文件的w权限)q,表示退出当前文件wq,表示保存并退出。wq!表示强制保存并退出set nu,会在文件中的每一行前面列出行号。输入set nonu,取消显示行号/(?)+关键字,查找文本中的关键字,按n继续向后(向前)寻找%s/dst/src/g,用src的内容替换文件中所有dst的内容vs+另一个文件名,可以新建分屏,通过ctrl+ww选择当前控制的分屏,每块屏可以独立进行操作。
gcc和g++是C/C++领域最常用的编译器,gcc只能用来编译C语言,g++可以编译C和C++
源文件形成可执行程序的过程,分为预处理、编译、汇编、链接。
gcc的使用格式是:gcc 选项 要编译的文件 选项 目标文件
gcc 源文件会直接将这个文件形成一个叫a.out的可执行文件。
gcc 源文件 -o 目标文件名可以指定形成的可执行文件名字。

预处理过程主要包括头文件展开、去注释、宏替换、判断条件编译。
使用选项-E,使gcc只进行预处理过程,形成中间文件:
gcc -E 源文件 -o 中间文件名

此时可以用vim打开这个test.i,可以看到此时头文件已经展开了,有几百行:

编译过程是将C语言翻译为汇编语言,这个阶段gcc要检查代码的语法和规范性
使用选项-S,使gcc只进行完这个阶段就停止,形成中间文件:
gcc -S 源文件(或完成预处理后的.i文件) -o 中间文件名

此时可以用vim打开这个test.s,可以看到内容是汇编语言了:

汇编阶段是把汇编语言转换为二进制语言。
使用选项-c,使gcc只进行完这个阶段就停止,形成中间文件:
gcc -c 源文件(或.i/.s文件) -o 中间文件名

此时可以用vim打开test.o,可以看到内容已经是无法显示的二进制语言了:

在链接阶段,要链接程序文件依赖的其他库文件,比如C语言标准库。这个阶段进行完,就真正形成了可执行文件,所以也没有其他选项:
gcc 源文件(或.i/.s/.o文件) -o 可执行文件名
由于gcc就是专门用来编译C语言的,所以我们不用写出C标准库它也会自动链接,如果是链接其他库文件就需要再额外操作了。

在我们的实际项目开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且它们之间存在多种依赖关系,比如一个源文件中可能用到另一个源文件中定义的函数。每一个.c文件会编译形成一个.o文件,然后在链接阶段将它们链接形成一个可执行程序,这个过程就是静态链接。 但是静态链接有缺点:因为每一个程序都有一份目标文件的副本,如果有多个程序都依赖了同一个文件,显然会造成存储空间浪费。而且每当库函数的代码修改后,都需要重新编译链接形成新的可执行文件,更新困难。
动态链接的出现解决了一些问题,它的基本思路是把程序按照功能模块拆分成各个相对独立的部分,在程序运行时才把它们链接完整。
ldd 可执行文件命令可以查询一个可执行文件的依赖的库

这里有一个重要的概念——库,也分为动态库和静态库
file 文件名查看一个文件的详细信息:

这就表示test可执行文件是动态链接的。
一般我们的云服务器上C/C++的静态库是没有安装的,可以通过指令sudo yum install glibc-static libstdc++-static -y(CentOS中)安装。
gcc中使用-static指令就可以指定使用静态链接。

所以,一般情况下都是用动态链接好~
本篇完,感谢阅读