Linux——环境基础开发工具的使用(2)

简介: Linux——环境基础开发工具的使用(2)

6.vim的配置

       新用户在使用vim编写代码时并不像在VS下有自动缩进、自动补齐、代码提示、语法高亮等;下图是我们自己手动缩进的,这里也并没有行号;

1ecd1b2606ed46e9956a89f231c9802c.png

①配置文件的位置

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即可;

1ecd1b2606ed46e9956a89f231c9802c.png

最后就可以看到和VS差不多的功能了

1ecd1b2606ed46e9956a89f231c9802c.png

三、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文件)

1ecd1b2606ed46e9956a89f231c9802c.png

2.编译

     此阶段完成语法和语义分析,然后生成中间代码,此中间代码是汇编代码,但是还不可执行,gcc编译的中间文件是[.s]文件。在此阶段会出现各种语法和语义错误,特别要小心未定义的行为,这往往是致命的错误。


       在Linux中,当预处理完生成了test.i文件后,想看到编译产生的汇编代码,可以执行下面的指令:

[mlg@VM-20-8-centos lesson1]$ gcc -S test.i -o test.s

-S:编译到汇编语言不进行汇编和链接

-o:文件输出到文件

1ecd1b2606ed46e9956a89f231c9802c.png

3.汇编

     此阶段主要完成将汇编代码翻译成机器码指令,并将这些指令打包形成可重定位的目标文件,[.o]文件,是二进制文件。此阶段由汇编器完成。

在Linux下,可以执行下面这个指令:

[mlg@VM-20-8-centos lesson1]$ gcc -c test.s -o test.o

-c:编译到目标代码

-o:文件输出到文件

image.png

4.链接

 此阶段完成文件中叼用的各种函数跟静态库和动态库的连接,并将它们一起打包合并形成目标文件,即可执行文件。此阶段由链接器完成。
[mlg@VM-20-8-centos lesson1]$ gcc test.o -o test

image.png

2.静态库与动态库

静态库:

       一般扩展名为(.a或.lib)

       静态库在编译的时候会直接整合到目标程序中(理解为拷贝),所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容;但是从升级难易度来看明显没有优势,如果函数库更新,需要重新编译。

动态库:

       动态函数库的扩展名一般为(.so或.dll)

       与静态库被整个整合到程序中不同,动态库在编译的时候,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用;也就是说可执行文件无法单独运行。这样从产品功能升级角度方便升级,只要替换对应动态库即可,不必重新编译整个可执行文件。

1.静态链接与动态链接的区别

一般gcc和g++默认都采用的是动态链接


       静态链接的过程就已经把要链接的内容已经链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;


       动态链接这个过程却没有把内容链接进去,而是在执行的过程中,再去找要链接的内容,生成的可执行文件中并没有要链接的内容,所以当你删除动态库时,可执行程序就不能运行。


       所以总的来说,动态链接生成的可执行文件要比静态链接生成的文件要小一些。

1ecd1b2606ed46e9956a89f231c9802c.png

2020062310470442.png

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++常用选项

image.png

四、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 选项

1ecd1b2606ed46e9956a89f231c9802c.png

从上图中可以发现debug版本和release版本下生成的可执行程序,文件大小是不一样的,也正说明了debug确实加入了一些调试信息

2. gdb指令

1.常用指令汇总

image.png

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 函数名

1ecd1b2606ed46e9956a89f231c9802c.png

2020062310470442.png

调试程序:runnextstep配合断点相关的指令

1ecd1b2606ed46e9956a89f231c9802c.png

2020062310470442.png

finishcontinueuntil的区别

在函数执行过程中,finish是用来结束当前函数

1ecd1b2606ed46e9956a89f231c9802c.png

在函数执行过程中,continue是用来直接到达下一个断点(在有断点的情况下)

2020062310470442.png

until是用来跳转值某一行的

1ecd1b2606ed46e9956a89f231c9802c.png

查看变量:print、display 以及undisplay

1ecd1b2606ed46e9956a89f231c9802c.png

退出调试是quit,可简写为q


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
17天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
24天前
|
前端开发 Linux
深度探索Linux操作系统 —— 构建桌面环境3
深度探索Linux操作系统 —— 构建桌面环境
29 12
|
16天前
|
Shell Linux API
C语言在linux环境下执行终端命令
本文介绍了在Linux环境下使用C语言执行终端命令的方法。首先,文章描述了`system()`函数,其可以直接执行shell命令并返回结果。接着介绍了更强大的`popen()`函数,它允许程序与命令行命令交互,并详细说明了如何使用此函数及其配套的`pclose()`函数。此外,还讲解了`fork()`和`exec`系列函数,前者创建新进程,后者替换当前进程执行文件。最后,对比了`system()`与`exec`系列函数的区别,并针对不同场景推荐了合适的函数选择。
|
24天前
|
存储 搜索推荐 Linux
深度探索Linux操作系统 —— 构建桌面环境1
深度探索Linux操作系统 —— 构建桌面环境
33 8
|
24天前
|
Linux 编译器 C语言
深度探索Linux操作系统 —— 构建桌面环境2
深度探索Linux操作系统 —— 构建桌面环境
26 6
|
26天前
|
应用服务中间件 Linux 网络安全
【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面
【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面
|
26天前
|
JSON Linux 网络安全
【Azure 应用服务】如何从App Service for Linux 的环境中下载Container中非Home目录下的文件呢?
【Azure 应用服务】如何从App Service for Linux 的环境中下载Container中非Home目录下的文件呢?
|
26天前
|
应用服务中间件 Linux 网络安全
【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
|
26天前
|
Linux PHP
【Azure 应用服务】PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢?
【Azure 应用服务】PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢?
|
26天前
|
JavaScript Linux API
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤