Linux开发工具 :vim 深入与 gcc 编译详解 本文为 Linux 开发工具专题的第二部分涵盖 vim 编辑器的进阶操作光标移动、复制粘贴、批量化注释、分屏、配置以及 gcc 编译器的完整翻译过程预处理、编译、汇编、链接最后简要介绍动静态库的概念。帮助同学们在 Linux 环境下高效编写和编译代码。一、课程目标今天我们继续 Linux 开发工具的学习主要内容包括vim 编辑器深入命令模式下的光标移动、复制粘贴、删除、替换、批量化注释、分屏操作、配置方法gcc/g 编译器程序的完整翻译过程预处理、编译、汇编、链接对应选项和中间文件动静态库概念动态库.so与静态库.a的基本认识注意从本节课开始建议同学们使用普通账号进行代码编写避免 root 权限隐藏潜在问题。需要提权时使用sudo。二、vim 编辑器深入2.1 光标移动命令命令模式命令作用gg光标定位到文件第一行GShiftg光标定位到文件最后一行nG如5G光标定位到第n行$Shift4光标定位到当前行行尾^Shift6光标定位到当前行行首第一个非空字符h/j/k/l左 / 下 / 上 / 右每个字符为单位w以单词为单位向后右移动b以单词为单位向前左移动带数字加速上述命令前都可加数字如5w向右移动 5 个单词10j向下移动 10 行。为什么用 hjkl 而不是方向键历史原因老式键盘没有独立方向键hjkl 就是方向键效率原因手不离开主键盘区配合其他命令更快兼容性某些场景如块选择只能用 hjkl2.2 编辑命令复制、粘贴、删除、替换命令作用yy复制当前行nyy如5yy复制从当前行开始的 n 行p在光标所在位置的下一行粘贴dd剪切删除当前行ndd剪切删除从当前行开始的 n 行x删除光标所在位置的字符向后删nx删除光标后 n 个字符XShiftx删除光标左侧的字符向前删r替换光标所在位置的单个字符输入 r 后再输入新字符nr替换光标后 n 个字符为同一字符RShiftr进入替换模式Replace输入的内容会覆盖原有字符按 ESC 退出~Shift波浪号切换大小写光标所在字符可带数字批量2.3 撤销与重做命令作用u撤销上一步操作可多次按持续撤销Ctrl r重做撤销刚才的撤销注意一旦保存并退出文件:wq重新打开后无法再撤销之前的操作。2.4 进入插入模式的多种方式命令作用i在光标当前位置进入插入模式a在光标后一个位置进入插入模式o在下一行新建一行并进入插入模式这三个i、a、o最常用够用了。2.5 底行模式常用命令进入底行模式命令模式下按:Shift 分号命令作用w保存writeq退出quitwq保存并退出q!强制退出不保存w!强制保存只读文件时set nu显示行号set nonu取消行号vs 文件名垂直分屏打开另一个文件!命令在底行中执行 shell 命令如!gcc code.c%s/旧/新/g全局替换%表示整个文件g表示全局示例:!ls -l # 查看当前目录文件按任意键返回 vim :%s/hello/world/g # 将全文的 hello 替换为 world2.6 分屏操作:vs test.c # 垂直分屏右侧打开 test.c切换光标到另一个分屏Ctrl w按两次Ctrl w w光标在哪个分屏底行命令就作用于哪个分屏可以连续:vs多次实现多屏2.7 批量化注释与去注释块视图模式批量化注释以 C 语言的//为例命令模式下按Ctrl v进入块视图模式左下角显示VISUAL BLOCK使用h/j/k/l或nG等命令选中要注释的行区域选中第一列按Shift i大写 I进入插入模式输入//注释符按ESC等待一两秒选中的所有行都会自动加上//批量化去注释Ctrl v进入块视图选中注释符所在的那一列可能需要按l向右扩展选择按d删除选中的列这个技巧非常实用可以快速注释/取消注释大段代码。2.8 快速查找命令模式下将光标移动到某个单词如main上按Shift #即#在数字 3 上面所有该单词会被高亮按n跳转到下一个匹配项按N跳转到上一个2.9 打开文件时直接定位到指定行vim code.c 14 # 打开 code.c 并将光标定位到第 14 行这在编译报错时非常有用根据错误提示的行号直接定位。2.10 vim 配置裸 vim未配置没有行号、语法高亮、自动缩进等功能配置文件用户家目录下的.vimrc隐藏文件每个用户独立配置不影响其他人常见配置项写入~/.vimrc下面是我在网上找的配置文件内容可以直接复制实现backspace删除 set nocompatible set backspaceindent,eol,start set number 突出显示当前行 set cursorline 设定 tab 长度为 4 set tabstop4 搜索时高亮显示被找到的文本 set hlsearch 开启新行时使用智能缩进 set smartindent 显示命令 set showcmd 命令行高度 set cmdheight2 syntax on Set syntax highlighting set autoindent Set up automatic indentation set mousea Set mouse is always available, set mouse (empty) cancel set cc80 Column 80 highlighted, set cc0 cancellation set cursorline Settings to highlight the current row set cindent Format C language set st4 Set the width of the soft tab to 4 spaces set shiftwidth4 The width automatically indented when setting a new line is 4 spaces set sts4 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 bgdark Show different background tones set hlsearch Enable Search Highlight set laststatus2 Always display the status bar 设置自动补全符号 Set Automatically Complete Parentheses inoremap ESCi inoremap ESCi inoremap ( ()ESCi inoremap [ []ESCi inoremap ESCi inoremap { {CR}ESCO 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.out3.2 程序的翻译过程一个 C/C 程序从源代码到可执行文件要经历四个阶段预处理 → 编译 → 汇编 → 链接。阶段作用gcc 选项生成文件后缀预处理头文件展开、宏替换、去注释、条件编译-E.i编译将 C 语言翻译成汇编语言-S.s汇编将汇编语言翻译成机器码可重定位目标文件-c.oWindows 下为.obj链接将多个.o文件和库链接成可执行文件无直接gcc -o可执行文件记忆技巧选项-E、-S、-c对应键盘左上角的ESCE、S、C中间文件后缀.i、.s、.o可以联想为ISO镜像文件后缀。3.3 分步演示1. 预处理gcc -E code.c -o code.icode.i仍然是 C 语言文件但已经展开了头文件、替换了宏、去掉了注释2. 编译gcc -S code.i -o code.s # 也可以直接从 .c 开始gcc -S code.c -o code.scode.s是汇编语言文件3. 汇编gcc -c code.s -o code.o # 或 gcc -c code.c -o code.ocode.o是二进制可重定位目标文件不能直接运行4. 链接gcc code.o -o code # 链接成可执行文件 ./code3.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 后缀特点动态库.soshared object.dll程序运行时加载节省内存更新方便静态库.aarchive.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,Ctrlr进入插入i,a,o底行操作:w,:q,:wq,:set nu,:vs,:!命令,:%s/old/new/g块视图Ctrlv进入配合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 code5.3 动静态库一句话理解动态库运行时找你要大家共用一份静态库编译时把你 copy 进程序自己独享