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 进程序,自己独享

相关推荐
屈九歌2 小时前
【Linux】V4L2框架分析《四》media_controller
linux
小成202303202652 小时前
Linux高级03
linux·开发语言
南境十里·墨染春水2 小时前
linux学习进展 进程
linux·运维·学习
cyber_两只龙宝2 小时前
【Oracle】Oracle之DQL中SELECT的基础使用
linux·运维·服务器·数据库·云原生·oracle
云栖梦泽2 小时前
Linux内核与驱动:10.平台总线platform
linux
Deitymoon2 小时前
linux——TCP多进程并发服务器
linux·服务器·tcp/ip
网络安全许木2 小时前
自学渗透测试第15天(基础复习与漏洞原理入门)
linux·网络安全·渗透测试·kali linux
Hello World . .3 小时前
linux驱动编程2 : uboot、Linux内核、rootfs来源及制作流程
linux·运维·服务器
.柒宇.3 小时前
Ansible自动化运维实战笔记:环境搭建与四大核心模块详解
运维·自动化·ansible