当前位置: 首页 > news >正文

【Linux】编辑器vim和编译器gcc/g++

vim是一个多模式编辑器,这里主要介绍三种:命令模式(command mode)、插⼊模式(Insert mode)和底⾏模式(last line mode)

 1.初识vim

  • vim 文件名:文件存在就直接进入,文件不存在时,按q直接退出不会新建这个文件,按wq保存退出就会新建这个文件
  • vim 文件名 +n:进入文件后,光标直接定位到第n行

    进入vim后默认的模式:命令模式

    退出vim:

    1.  shift+;(其实就是,然后按q退出 
    2.  输入两次大写的ZZ

    在命令模式下,按i:换到插入模式

     

    在插入模式下不能直接退出,可以先按键盘左上角的ESC键,退回到命令模式

     然后输入两次大写的ZZ进行退出。

    还有就是切换到底行模式退出,用shift+;(其实就是,然后按q退出 

    如果里面写了内容,就输入wq,保存并退出。 

    设置行号:在底行模式下输入set nu 

    底行模式回退到命令模式: 按键盘左上角的ESC

    但是我们不可以直接从底行模式切换到插入模式,从插入模式切换到底行模式也不可以,只能通过命令模式切换。

    2.vim的3种模式

    2.1 命令模式

    命令模式就是快速编辑

    • gg:光标直接定位最开始
    • GG(shift+g):光标直接定位最结尾
    • n G(shift+g):光标定位到第n行
    • &(shift+4):光标定位到这一文本行的最右边
    • ^(shift+6):光标定位到这一文本行的最左边

    如果只想要光标上下左右移动,有2种方法:

    1. 键盘的上下左右键
    2. h(左)、j(下)、k(上)、l(右)

    • w:光标以单词为单位移动,其他特殊符号不做多的考虑。
    • b:光标以单词为单位移动

    上面的命令都可以带n。

    • yy:复制光标所在行的内容
    • p:光标所在位置的下一行进行粘贴粘贴

    yy和p前面都可以带n,进行批量化复制粘贴。

    • dd:剪切当前行,也可以用来删除
    • x:删除光标所在位置的字符,光标后面的内容会往前移,光标也会移动
    • X(shift+x):删除光标所在位置的前面的字符,光标不动
    • u撤销历史操作
    • ctrl + r:撤销刚刚的撤销,就是撤销u操作

    u 和 ctrl + r互为对方的撤销,撤销操作一旦退出文件,就无法进行撤销操作了,但是如果只是保存,没有退出,就可以撤销。

    • r+新内容:替换光标所在字符为新内容
    • R(shift+r):批量化替换内容,左下角会出现REPLACE的标识,这个模式叫替换模式,退出替换模式按ESC

    • ~:光标所在位置字母的大小写切换

    批量化增加操作:以注释为例

    •  V(ctrl+v):从命令模式切换到视图模式

     

    •  然后通过h、j、k、l进行区域选择(如果按G,会直接选中到最后一行,别的指令区域选择也可以)
    • I(shift+i):直接从视图模式切换到插入模式

    • 然后在插入模式下直接输入//,注释一行
    • 最后按ESC,这个操作会批量化注释刚刚所选区域,而且会直接退回到命令模式下。

    在不能撤销的情况下,批量化删除操作:以取消注释为例

    1. 先 V(ctrl+v)进入视图模式
    2. 对要删除的部分区域选择
    3. 按d,直接删除,并且会退回到命令模式下
    • #(shift+3):查找光标所在位置的单词,按n逆向查找

    2.2 插入模式

    进入插入模式:

    • i:直接进入,光标无变化
    • a:进入插入模式,光标向后移动一个
    • o:进入插入模式,并且会向下新增1行,光标也会移动到新增的这一行

    这个模式就是编写内容的,没有啥特别的

    2.3 底行模式

    进入底行模式:冒号:(shift+;)

    • q:退出
    • w:保存
    • wq:保存并退出
    • wq!:强制保存并退出
    • set nu:设置行号
    • set nonu:取消行号
    • %s/被修改内容/指定内容/:批量化将所有被修改内容修改为指定内容
    • vs 文件名:再打开一个文件(可以分很多文件)
    • ctrl + w + w:光标在文件之间切换(命令模式)

    3.gcc/g++

    • gcc xxx.c:编译,会生成a.out的可执行程序

    •  gcc xxx.c -o yyy:a.out是默认的名字,-o可指定可执行程序的文件名

    •  ./a.out:运行 

    3.1 细看程序翻译过程

    我们再分别对程序翻译的4个步骤展开学习,以下面这个程序为例。

      1 #include <stdio.h>  2 #define  M 5                                                                                                                                                           3 #define  N 1004 int main()5 {6     //注释xxxxxxxxx7     for(int i = 0; i < M; i++)8     {9         printf("hello world!\n");10     }11 12 #ifdef N13     printf("N = %d\n", N);14 #else15     printf("No N");16 #endif17     return 0;18 }
    

    程序翻译的4个步骤:

    1. 预处理(进⾏宏替换/去注释/条件编译/头⽂件展开等)
    2. 编译(⽣成汇编)
    3. 汇编(⽣成机器可识别代码)
    4. 连接(⽣成可执⾏⽂件或库⽂件) 
    •   gcc -E xxx.c -o xxx.i:把预处理结果放到xxx.i文件中

    -E这个选项的意思就是:开始进行程序翻译,在预处理做完时就停下来,不用再往后执行了。

     我们用vim打开这个code.i文件,会发现代码变得特别多。

    从这个文件就能看出预处理阶段会把头文件展开去掉注释宏替换条件编译

    预处理的本质就是修改编辑我们的文本代码 ;code.i里的内容此时还是C语言

    • gcc -S xxx.i -o xxx.s:形成xxx.i的汇编语言放到xxx.s文件里。

    -S选项意思就是:开始进行程序翻译,编译做完时就停下来,不用再往后执行了。

    • gcc -c xxx.s -o xxx.o:生成可重定位目标文件,在win系统中就是以.obj结尾的文件

    -c选项意思就是:开始进行程序翻译,汇编完成就停下来,不用再往后执行了。

    此时这个code.o文件就已经是二进制文件了,打卡这个 code.o文件看到的就是一堆乱码。

    不带-o选项的话,默认生成的是同名.o文件 

    • gcc code.o -o code:生成可执行文件。

      有多个.o文件时,我们可以把所有的.o文件一起进行gcc,让他们整体形成一个可执行程序

      以下面这段代码为例

      #include <stdio.h>                                                                                                                                                         
      int main()
      {
      #ifdef M printf("免费版\n");
      #elseprintf("专业版\n");
      #endif
      }

       此时没有宏定义,输出结果为"专业版"

      • gcc code.o -o code -DM:命令行式的宏定义

       宏定义M默认取值为1,可以用 -DM=n 让M取值为n

       3.2 初始动静态库

      库就是一套方法或者数据集,为我们开发提供最基本的保证(基本接口、功能、加速我们二次开发)

      •  ldd 可执行文件:查看可执行文件依赖的库

      前面的代码我们所依赖的C语言的c标准库就是这个

      用 ls -l 查看这个库,就会出现这个绿色的文件 libc-2.31.so

      C语言里的类似printf的实现就是在这个库里保存的,用的时候就要到这个库里执行然后再返回。 

      • Linux下,动态库XXX.so, 静态库XXX.a
      • Windows下,动态库XXX.dll, 静态库XXX.lib

      • 动态链接(编译时发生的)就是,让我的程序,能找到库中的方法的地址
      • 静态链接:把我们程序中用到的库方法拷贝到我的程序相应的位置,
      • 静态库:只有在链接的时候有用,一旦形成可执行程序,静态库就不再需要

      动静态库对比:

      1. 动态库形成的可执行程序体积一定很小
      2. 可执行程序对静态库的依赖度小,而动态库不能缺失
      3. 程序运行时,需要加载到内存,静态链接的,会在内存中出现大量的重复代码
      4. 动态链接比较节省内存和磁盘资源
      •  file 可执行文件:查看可执行文件依赖的库的更详细的信息

      可以看到gcc编译连接方法是默认是动态连接的,动态链接的前提是这个库存在

      • gcc code.c -o code -static:用静态链接

      然后再用file查看库详细信息时,就会发现连接方法变成了静态链接,而且内存也变大了。 

      而且静态链接时,用ldd查这个可执行文件依赖的库是查不到的。 

      我们也可以找c++的动态库和静态连接

      http://www.lryc.cn/news/602068.html

      相关文章:

    • 解析分区、挂载与块设备:Linux 存储管理核心命令详解
    • 近屿智能正式发布AI得贤招聘官的AI面试官智能体6.3版本:交付替代人类面试官的打分结果
    • 零基础学习性能测试第九章:全链路追踪-项目实操
    • Jenkins + SonarQube 从原理到实战一:基于 K8s 部署与使用(含中文插件与 Python 扫描)
    • 力扣1457. 二叉树中的伪回文路径
    • 力扣面试150(42/150)
    • 旧物回收小程序:科技赋能,让旧物回收焕发生机
    • 软件测试之功能测试
    • 6种将iPhone照片传输到Windows 10电脑的方法
    • 跨境协作系统文化适配:多语言环境下的业务符号隐喻与交互习惯
    • 快速了解MySQL
    • Ubuntu lamp
    • 分布式IO选型指南:2025年分布式无线远程IO品牌及采集控制方案详解
    • 四、计算机组成原理——第3章:存储系统
    • 低速信号设计之 SMBUS 篇
    • Power Query概述及导入多源数据方法
    • 从fork到exit:剖析Linux进程的诞生、消亡机制
    • C盘清理大赛技术指南
    • 凸优化:凸函数的一些常用性质
    • 动/静态库的原理及制作
    • 开源B端生态掘金:从Odoo二次开发到行业专属模块的技术变现
    • Qwen 系列模型实现文本改写工具
    • Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式能源接入与电网稳定性保障中的应用(368)
    • Java从入门到精通!第十八天(JDK17安装以及网络编程) 完结篇!!!
    • WPF,窗口拖动事件与窗口内控件点击事件
    • Visual Studio Code使用
    • MCP资源管理深度实践:动态数据源集成方案
    • Jenkins vs GitLab CI/CD vs GitHub Actions在容器化部署流水线中的对比分析与实践指南
    • Spring Boot 2整合Druid的两种方式
    • Spring Boot日志开发实战手册:集成/输出/级别控制/持久化精要