注意:未做说明以下都是在命令模式下进行
编辑过程中遇到的问题:
误按了:ctrl + z : 可以将一个正在前台执行的命令放到后台,并且暂停
再次打开就变成了以下这样
1 | E325: 注意 |
解决办法:
使用 fg :将后台中的命令调至前台继续运行
1. vim 工作模式

gcc hello.c -o a:编译成可执行文件a./a:运行可执行文件 a
2 vim 命令模式进入输入模式的快捷键
i: 输入,光标前面I: 输入,光标前面a: 输入,光标会逻动一个位置A:输入,光标会逻动到最后o:输入,光标会逻动到下一行O:输入,光标会逻动到上一行s:输入,会删除光标所在字符S: 输入,会删除光标所在行h: 向左移动光标l: 向右移动光标j: 向下移动光标k: 向上移动光标
2.1.跳转和删除
5G:跳转到第 5 行5回车或者G:跳转到末行行首gg: 跳转到首行行首$: 跳转到当行行尾0: 跳转到当行行首gg=G: 格式化代码dw:删除单词从光标到单词结束的地方x: 删除某个字母d0: 删除光标至行首v+h/j/k/l+d或者v+上/下/左/右+d:删除选中区域dd: 剪切整行,可以当删除3dd: 从当前行剪切 3 行,可以当删除
2.2. 复制、粘贴
yy: 复制当前行3yy: 从当前行复制 3 行p: 粘贴到当前行的下一行P: 粘贴到当前行的上一行dd: 剪切整行3dd: 从当前行剪切 3 行
2.3 查找替换
/ + '要查找的内容' +回车: 查找 , ‘*’或‘n’ 跳转到下一个, ‘N’ 是查看上一个r + '要替换的字符':把当前光标字符替换成 ‘要替换的字符’:s /printf/println: 将当前光标所在行中的第一个printf替换成println:%s /printf/println: 将每一行中的第一个printf替换成println:s /printf/println/g:将这一行的所有printf替换成println:%s /printf/println/g: 将所有地方的printf替换成println:1,3s /printf/println/g: 将1-3行的所有printf替换成println
2.4.其它命令
u: 撤销ctrl+r: 反撤销:sp: 上下分屏:vsp: 左右分屏ctrl + ww: 切换分屏wqall: 保存退出所有3+K或2+K: 跳转到光标所指向的函数声明
3. gcc 编译的四个步骤
.c 文件 -> 可执行文件,经历了四个步骤
3.1 预处理阶段
将所有的宏定义的替换,类似于 java 的 final,展开include的文件
gcc -E -o hello.i hello.c: 将 hello.c 文件预处理成 hello.i 文件
3.2 预编译阶段
在这个阶段,GCC 才会去检测你代码的规范性,语法是否有错误,gcc 会把代码翻译成汇编
gcc -S -o hello.s hello.i:将 hello.i 文件预编译成 hello.i 文件
3.3 汇编阶段
把 .s 文件翻译成二进制.o文件(机器的指令),文本打开的是乱码
gcc -c -o hello.o hello.s:将 hello.s 汇编成 hello.o 文件
3.4 链接阶段
计算逻辑地址,合并数据段,有些函数是在另外一个 so 库文件中的。
gcc -o hello hello.o:这个时候就可以执行hello了
4.动态库和静态库
静态库:其实是内容的拷贝(代码),运行阶段没有 .a 文件了也是可以执行的。动态库:不会拷贝内容,运行阶段起的作用(加载),生成 so 的时候要生成与位置无关的代码,没有 so 不能运行。
4.1 静态库的生成:
4.1.1 将 c 生成 .o
1 | gcc -c add.c -o add.o // 将 add.c 文件输出为 .o文件 |
4.1.2. 使用 ar 工具制作静态库
1 | ar rcs libmath.a add.o xxx.o // 将 add.o 和 xxx.o 文件制作到 libmath.a 中 |
4.1.3. 编译静态库到可执行文件
1 | gcc a.c libmath.a -o hello // 将 a.c 和 libmath.a 输出到可执行文件 hello 中 |
4.2 动态库生成
4.2.1 将 c 生成 .o (要生成与位置无关的代码)
1 | gcc -c add.c -o add.o -fPIC // // 将 add.c 文件输出为 .o文件 要加 -fPIC |
4.2.2 使用 gcc -shared 制作动态库
1 | gcc -shared -o libmath.so add.o xxx.o // // 将 add.o 和 xxx.o 文件制作到 libmath.so 中 |
4.2.3 编译动态库到可执行文件,需要指定动态库的名称 -l , 指定库路径 -L
1 | gcc a.c -o a -lmath -L./ // libmath.so 要写成math, ./ 代表当前文件夹 |
5.虚拟内存与物理内存
虚拟内存 是为了缓解物理内存的压力而创建的,他们之间是通过映射来进行的联系
每个进程都有4G的虚拟地址空间,其中3G用户空间,1G内核空间(linux),每个进程共享内核空间,独立的用户空间:
