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
目录
相关文章
|
2天前
|
编解码 Linux 5G
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
AVS3,中国制定的第三代音视频标准,是首个针对8K和5G的视频编码标准,相比AVS2和HEVC性能提升约30%。uavs3d是AVS3的解码器,支持8K/60P实时解码,且在各平台有优秀表现。要为FFmpeg集成AVS3解码器libuavs3d,需从GitHub下载最新源码,解压后配置、编译和安装。之后,重新配置FFmpeg,启用libuavs3d并编译安装,通过`ffmpeg -version`确认成功集成。
13 0
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
|
4天前
|
运维 Linux Docker
ChatGLM3在Docker环境部署,Linux运维免打包多渠道统计如何实现
ChatGLM3在Docker环境部署,Linux运维免打包多渠道统计如何实现
|
4天前
|
运维 Linux Docker
ChatGLM3在Docker环境部署(1),Linux运维电话面试技巧
ChatGLM3在Docker环境部署(1),Linux运维电话面试技巧
|
4天前
|
Web App开发 Ubuntu Linux
Linux无图形界面环境使用Python+Selenium实践
【5月更文挑战第1天】Linux无图形界面环境使用Python+Selenium实践
42 2
|
4天前
|
数据可视化 Unix Linux
Linux|基础环境开发工具使用(1)
Linux|基础环境开发工具使用(1)
|
6天前
|
关系型数据库 MySQL Linux
在Linux系统上实现高效安装与部署环境的全方位指南
在Linux系统上实现高效安装与部署环境的全方位指南
|
6天前
|
Linux 开发工具 Android开发
【Linux修行路】基础开发工具——yum
【Linux修行路】基础开发工具——yum
|
6天前
|
运维 NoSQL Linux
linux环境收集core文件步骤
请注意,生成core文件可能会占用磁盘空间,因此应谨慎使用。一旦完成故障排查,建议将相关的core文件删除以释放磁盘空间。
42 5
|
6天前
|
运维 NoSQL Linux
linux环境收集core文件步骤
请注意,生成core文件可能会占用磁盘空间,因此应谨慎使用。一旦完成故障排查,建议将相关的core文件删除以释放磁盘空间。
23 4
|
6天前
|
Linux 开发者
【亮剑】Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件
【4月更文挑战第30天】本文介绍了Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件。flock适合脚本,fcntl提供底层灵活性,lockfile用于管理锁定文件,flockfile则结合两者功能。选择锁定策略时需考虑应用场景,如脚本可选flock,复杂需求则用fcntl。理解并正确使用这些工具对保证系统稳定性和数据一致性至关重要。