6.vim的配置
新用户在使用vim编写代码时并不像在VS下有自动缩进、自动补齐、代码提示、语法高亮等;下图是我们自己手动缩进的,这里也并没有行号;
①配置文件的位置
1.在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
2.而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建之。
3.切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~
4.打开自己目录下的.vimrc文件,执行 vim .vimrc
②vim配置方法
1.采用手动配置:在普通用户下创建一个.vimrc文件,执行vim . vimrc ,例如:设置行号(set nu)、设置语法高亮(syntax on);保存并退出,简单测试一下 vim test.c 此时行号和语法高亮都能正常显示。虽然可行,但是不推荐这样做,我们可以采用第二种做法;
2.vim的配置相对比较复杂,某些配置还需要使用到插件,我们可以直接执行下面的代码,
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
需要输入root密码,等待片刻后,手动执行source ~/.bashrc即可;
最后就可以看到和VS差不多的功能了
三、Linux编辑器 — gcc/g++的使用
1.gcc和g++的使用
在Linux中,gcc是C的编译器,g++是C++的编译器;一个程序能够执行起来,一般需要经过四个步骤:预处理、编译、汇编和链接。以下图程序为例,对这四个阶段进行在Linux中的操作进行介绍。
#include <stdio.h> #define NUM 100 int main() { printf("hello vim\n"); //printf("hello vim\n"); //printf("hello vim\n"); //printf("hello vim\n"); //printf("hello vim\n"); printf("hello vim\n"); printf("NUM = %d\n",NUM); return 0; }
1.预处理
在预处理阶段主要负责的是头文件的展开、去掉注释、宏替换、条件编译等。以#号开头的是预处理指令:#define #if #include......此阶段产生【.i文件】
在Linux中,如果想要看到预处理后的结果,可以执行下面的指令:
[mlg@VM-20-8-centos lesson1]$ gcc -E mytest.c -o test.i
-E:只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面(xx.i文件)
-o:文件输出到文件(将mytest.c文件输出到test.i文件)
2.编译
此阶段完成语法和语义分析,然后生成中间代码,此中间代码是汇编代码,但是还不可执行,gcc编译的中间文件是[.s]文件。在此阶段会出现各种语法和语义错误,特别要小心未定义的行为,这往往是致命的错误。
在Linux中,当预处理完生成了test.i文件后,想看到编译产生的汇编代码,可以执行下面的指令:
[mlg@VM-20-8-centos lesson1]$ gcc -S test.i -o test.s
-S:编译到汇编语言不进行汇编和链接
-o:文件输出到文件
3.汇编
此阶段主要完成将汇编代码翻译成机器码指令,并将这些指令打包形成可重定位的目标文件,[.o]文件,是二进制文件。此阶段由汇编器完成。
在Linux下,可以执行下面这个指令:
[mlg@VM-20-8-centos lesson1]$ gcc -c test.s -o test.o
-c:编译到目标代码
-o:文件输出到文件
4.链接
此阶段完成文件中叼用的各种函数跟静态库和动态库的连接,并将它们一起打包合并形成目标文件,即可执行文件。此阶段由链接器完成。
[mlg@VM-20-8-centos lesson1]$ gcc test.o -o test
2.静态库与动态库
静态库:
一般扩展名为(.a或.lib)
静态库在编译的时候会直接整合到目标程序中(理解为拷贝),所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容;但是从升级难易度来看明显没有优势,如果函数库更新,需要重新编译。
动态库:
动态函数库的扩展名一般为(.so或.dll)
与静态库被整个整合到程序中不同,动态库在编译的时候,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用;也就是说可执行文件无法单独运行。这样从产品功能升级角度方便升级,只要替换对应动态库即可,不必重新编译整个可执行文件。
1.静态链接与动态链接的区别
一般gcc和g++默认都采用的是动态链接
静态链接的过程就已经把要链接的内容已经链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;
动态链接这个过程却没有把内容链接进去,而是在执行的过程中,再去找要链接的内容,生成的可执行文件中并没有要链接的内容,所以当你删除动态库时,可执行程序就不能运行。
所以总的来说,动态链接生成的可执行文件要比静态链接生成的文件要小一些。
2.如何实现静态链接(含安装)
我们可以执行这样的指令:
[mlg@VM-20-8-centos lesson1]$ gcc mytest.c -o test1 -static
如果出现这种情况的报错,是因为在新版本的linux 系统下安装 glibc-devel、glibc和gcc-c++时,都不会安装libc.a. 只安装libc.so. 所以当使用-static时,libc.a不能使用。只能报找不到libc了。
/usr/bin/ld: cannot find -lc
安装glibc-static sudo yum install glibc-static
3. gcc/g++常用选项
四、Linux编辑器 — gdb的使用
1.gdb的基本概念
Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况。
1.程序的发布方式有两种,debug模式和release模式
debug模式:只有在debug下才可以进行调试,因为该模式下加入了debug调试信息;
release模式:去掉了这些调试信息,是不可以被调试的
2.Linux下gcc/g++出来的二进制程序, 默认是release模式
3.要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
从上图中可以发现debug版本和release版本下生成的可执行程序,文件大小是不一样的,也正说明了debug确实加入了一些调试信息
2. gdb指令
1.常用指令汇总
2.指令操作演示
通过下面的代码来演示Linux下调试的技巧
#include <stdio.h> int fun(int p) { int i = 0; int sum = 0; for(i = 0;i <= p;i++) { sum += i; } return sum; } int main() { int x = 100; int ret = 0; ret = fun(x); printf("ret = %d\n",ret); return 0; }
查看源代码 —— list 行号 和 list 函数名,可简写为 l 行号 和 l 函数名
调试程序:run、next、step配合断点相关的指令
finish、continue 和 until的区别
在函数执行过程中,finish是用来结束当前函数
在函数执行过程中,continue是用来直接到达下一个断点(在有断点的情况下)
until是用来跳转值某一行的
查看变量:print、display 以及undisplay
退出调试是quit,可简写为q