Linux :vim 深入与 gcc 编译详解

本文为 Linux 开发工具专题的第二部分,涵盖 vim 编辑器的进阶操作(光标移动、复制粘贴、批量化注释、分屏、配置)以及 gcc 编译器的完整翻译过程(预处理、编译、汇编、链接),最后简要介绍动静态库的概念。帮助同学们在 Linux 环境下高效编写和编译代码。

一、课程目标

今天我们继续 Linux 开发工具的学习,主要内容包括:

  1. vim 编辑器深入:命令模式下的光标移动、复制粘贴、删除、替换、批量化注释、分屏操作、配置方法

  2. gcc/g++ 编译器:程序的完整翻译过程(预处理、编译、汇编、链接),对应选项和中间文件

  3. 动静态库概念:动态库(.so)与静态库(.a)的基本认识

注意 :从本节课开始,建议同学们使用普通账号 进行代码编写,避免 root 权限隐藏潜在问题。需要提权时使用 sudo


二、vim 编辑器深入

2.1 光标移动命令(命令模式)

命令 作用
gg 光标定位到文件第一行
G(Shift+g) 光标定位到文件最后一行
nG(如 5G 光标定位到第 n
$(Shift+4) 光标定位到当前行行尾
^(Shift+6) 光标定位到当前行行首(第一个非空字符)
h / j / k / l 左 / 下 / 上 / 右(每个字符为单位
w 单词为单位向后(右)移动
b 单词为单位向前(左)移动

带数字加速 :上述命令前都可加数字,如 5w 向右移动 5 个单词,10j 向下移动 10 行。

为什么用 hjkl 而不是方向键?

  • 历史原因:老式键盘没有独立方向键,hjkl 就是方向键

  • 效率原因:手不离开主键盘区,配合其他命令更快

  • 兼容性:某些场景(如块选择)只能用 hjkl

2.2 编辑命令(复制、粘贴、删除、替换)

命令 作用
yy 复制当前行
nyy(如 5yy 复制从当前行开始的 n 行
p 在光标所在位置的下一行粘贴
dd 剪切(删除)当前行
ndd 剪切(删除)从当前行开始的 n 行
x 删除光标所在位置的字符(向后删)
nx 删除光标后 n 个字符
X(Shift+x) 删除光标左侧的字符(向前删)
r 替换光标所在位置的单个字符(输入 r 后再输入新字符)
nr 替换光标后 n 个字符为同一字符
R(Shift+r) 进入替换模式(Replace),输入的内容会覆盖原有字符,按 ESC 退出
~(Shift+波浪号) 切换大小写(光标所在字符,可带数字批量)

2.3 撤销与重做

命令 作用
u 撤销上一步操作(可多次按,持续撤销)
Ctrl + r 重做(撤销刚才的撤销)

注意 :一旦保存并退出文件(:wq),重新打开后无法再撤销之前的操作。

2.4 进入插入模式的多种方式

命令 作用
i 在光标当前位置进入插入模式
a 在光标后一个位置进入插入模式
o 下一行新建一行并进入插入模式

这三个(iao)最常用,够用了。

2.5 底行模式常用命令

进入底行模式:命令模式下按 :(Shift + 分号)

命令 作用
w 保存(write)
q 退出(quit)
wq 保存并退出
q! 强制退出(不保存)
w! 强制保存(只读文件时)
set nu 显示行号
set nonu 取消行号
vs 文件名 垂直分屏打开另一个文件
!命令 在底行中执行 shell 命令(如 !gcc code.c
%s/旧/新/g 全局替换(% 表示整个文件,g 表示全局)

示例

复制代码
:!ls -l          # 查看当前目录文件,按任意键返回 vim
:%s/hello/world/g   # 将全文的 hello 替换为 world

2.6 分屏操作

复制代码
:vs test.c       # 垂直分屏,右侧打开 test.c
  • 切换光标到另一个分屏Ctrl + w 按两次(Ctrl w w

  • 光标在哪个分屏,底行命令就作用于哪个分屏

  • 可以连续 :vs 多次,实现多屏

2.7 批量化注释与去注释(块视图模式)

批量化注释 (以 C 语言的 // 为例):

  1. 命令模式下按 Ctrl + v 进入块视图模式(左下角显示 VISUAL BLOCK

  2. 使用 h/j/k/lnG 等命令选中要注释的行区域(选中第一列)

  3. Shift + i(大写 I)进入插入模式

  4. 输入 //(注释符)

  5. ESC,等待一两秒,选中的所有行都会自动加上 //

批量化去注释

  1. Ctrl + v 进入块视图

  2. 选中注释符所在的那一列(可能需要按 l 向右扩展选择)

  3. d 删除选中的列

这个技巧非常实用,可以快速注释/取消注释大段代码。

2.8 快速查找

  • 命令模式下,将光标移动到某个单词(如 main)上,按 Shift + #(即 #,在数字 3 上面),所有该单词会被高亮

  • n 跳转到下一个 匹配项,按 N 跳转到上一个

2.9 打开文件时直接定位到指定行

复制代码
vim code.c +14     # 打开 code.c 并将光标定位到第 14 行

这在编译报错时非常有用:根据错误提示的行号,直接定位。

2.10 vim 配置

  • 裸 vim(未配置)没有行号、语法高亮、自动缩进等功能

  • 配置文件:用户家目录下的 .vimrc(隐藏文件)

  • 每个用户独立配置,不影响其他人

  • 常见配置项(写入 ~/.vimrc):

  • 下面是我在网上找的配置文件内容可以直接复制

sql 复制代码
"实现backspace删除
set nocompatible 
set backspace=indent,eol,start


set number
" 突出显示当前行
set cursorline
" 设定 tab 长度为 4
set tabstop=4
" 搜索时高亮显示被找到的文本
set hlsearch
"开启新行时使用智能缩进
set smartindent
"显示命令
set showcmd
"命令行高度
set cmdheight=2

syntax on               " Set syntax highlighting
set autoindent          " Set up automatic indentation
set mouse=a             " Set mouse is always available, set mouse= (empty) cancel
set cc=80               " Column 80 highlighted, set cc=0 cancellation
set cursorline          " Settings to highlight the current row
set cindent             " Format C language
set st=4                " Set the width of the soft tab to 4 spaces
set shiftwidth=4        " The width automatically indented when setting a new line is 4 spaces
set sts=4               " Set the number of spaces inserted when the Tab key is pressed in insertion mode to 4
set ruler               " Show the status of the last line
set showmode            " The status of this row is displayed in the lower left corner.
set bg=dark             " Show different background tones
set hlsearch            " Enable Search Highlight
set laststatus=2        " Always display the status bar

"设置自动补全符号
" Set Automatically Complete Parentheses
inoremap ' ''<ESC>i
inoremap " ""<ESC>i
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap < <><ESC>i
inoremap { {<CR>}<ESC>O



"autocmd BufNewFile *.c 0r /usr/share/vim/vimfiles/template.c
"设置头文件及主函数模板                                                         
autocmd BufNewFile *.c 0r /etc/vim/template.c

"恢复复制粘贴功能
if has('mouse')
set mouse-=a
endif

一键配置方案(仅支持 CentOS 7,普通用户执行):

复制代码
curl -sLf https://gitee.com/makecodeforcpy/vimforcpp/raw/master/install.sh | bash
source ~/.bashrc
  • 不要用 root 执行

  • 如果下载慢或失败,多试几次,或手动从 GitHub/Gitee 找其他配置

三、gcc/g++ 编译器

3.1 基本编译

复制代码
gcc code.c -o mycode    # 编译 code.c,生成可执行文件 mycode
./mycode                # 运行
  • -o 选项指定输出文件名,不写则默认生成 a.out

3.2 程序的翻译过程

一个 C/C++ 程序从源代码到可执行文件要经历四个阶段:预处理 → 编译 → 汇编 → 链接

阶段 作用 gcc 选项 生成文件后缀
预处理 头文件展开、宏替换、去注释、条件编译 -E .i
编译 将 C 语言翻译成汇编语言 -S .s
汇编 将汇编语言翻译成机器码(可重定位目标文件) -c .o(Windows 下为 .obj
链接 将多个 .o 文件和库链接成可执行文件 无(直接 gcc -o 可执行文件

记忆技巧 :选项 -E-S-c 对应键盘左上角的 ESC(E、S、C),中间文件后缀 .i.s.o 可以联想为 ISO(镜像文件后缀)。

3.3 分步演示

1. 预处理

复制代码
gcc -E code.c -o code.i
  • code.i 仍然是 C 语言文件,但已经展开了头文件、替换了宏、去掉了注释

2. 编译

复制代码
gcc -S code.i -o code.s   # 也可以直接从 .c 开始:gcc -S code.c -o code.s
  • code.s 是汇编语言文件

3. 汇编

复制代码
gcc -c code.s -o code.o   # 或 gcc -c code.c -o code.o
  • code.o 是二进制可重定位目标文件,不能直接运行

4. 链接

复制代码
gcc code.o -o code        # 链接成可执行文件
./code

3.4 多文件编译

通常做法:先将每个 .c 文件编译成 .o,最后统一链接。

复制代码
gcc -c main.c -o main.o
gcc -c add.c -o add.o
gcc main.o add.o -o program
  • 好处:修改某个文件只需重新编译该文件,再链接即可,节省时间

  • 也方便制作库文件

3.5 查看可执行文件依赖的库

复制代码
ldd code       # 查看 code 依赖哪些动态库

输出中通常有 libc.so.6 → 这就是 C 标准库(动态库)


四、动静态库简介

4.1 什么是库?

库是预先编译好的二进制代码 ,供其他程序调用。例如 printf 函数的实现就在 C 标准库中。

4.2 动态库与静态库

类型 Linux 后缀 Windows 后缀 特点
动态库 .so(shared object) .dll 程序运行时加载,节省内存,更新方便
静态库 .a(archive) .lib 编译时链接到可执行文件中,程序独立,体积大
  • 我们平时用 gcc 默认链接的是动态库 (如 libc.so

  • 查看系统 C 标准库:ls -l /lib64/libc.so.*

4.3 为什么要有库?

  • 代码复用,避免重复造轮子

  • 隐藏实现细节,只提供接口

  • 动态库可实现热更新

关于动静态库的制作和使用,后续会有专题讲解。


五、本节课总结

5.1 vim 核心命令汇总

类别 常用命令
光标移动 gg, G, nG, $, ^, w, b, hjkl
复制粘贴 yy, nyy, p
删除剪切 dd, ndd, x, X
替换 r, nr, R
撤销重做 u, Ctrl+r
进入插入 i, a, o
底行操作 :w, :q, :wq, :set nu, :vs, :!命令, :%s/old/new/g
块视图 Ctrl+v 进入,配合 hjkl 选择,I 批量插入,d 批量删除
查找 Shift+# 高亮单词,n / N 跳转

5.2 gcc 编译流程

复制代码
预处理:gcc -E code.c -o code.i
编译:  gcc -S code.i -o code.s
汇编:  gcc -c code.s -o code.o
链接:  gcc code.o -o code

5.3 动静态库一句话理解

  • 动态库:运行时找你要,大家共用一份

  • 静态库:编译时把你 copy 进程序,自己独享

相关推荐
A小辣椒1 分钟前
TShark:基础知识
linux
AlfredZhao2 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao17 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux