vim
一个文本编辑程序,没有菜单,只有命令,且命令繁多
各种模式的操作
命令模式
移动光标:
h: ← 左移
l: → 右移
j: ↓ 下移
k: ↑ 上移
gg: 光标移动文件开头
G: 光标移动到文件末尾
0: 光标移动到行首
$: 光标移动到行尾
nG: 跳转到第n行
删除(剪切):
x: 删除光标后一个字符,相当于 Del
X: 删除光标前一个字符,相当于 Backspace
dw: 删除光标开始位置的字,包含光标所在字符(光标必须移动到删除单词的首字符上)
d0: 删除光标前本行所有内容,不包含光标所在字符
D(d$): 删除光标后本行所有内容,包含光标所在字符
dd: 删除光标所在行
n dd 删除指定的行数
撤销:
u: 一步一步撤销
Ctr-r: 反撤销
复制粘贴:
yy: 复制当前行,n yy 复制 n 行
p: 在光标所在位置向下新开辟一行,粘贴
P: 从光标所在行, 开始粘贴
查找:
/要查找的 从光标所在位置向后查找 (n: 下一个 N:上一个)
?要查找的 从光标所在位置向前查找
替换:
r: 替换当前字符
文本行移动:
>>: 文本行右移
<<: 文本行左移
文本输入模式:
i: 插入光标前一个字符
I: 插入行首
a: 插入光标后一个字符
A: 插入行未
o: 向下新开一行,插入行首
O: 向上新开一行,插入行首
s: 删除光标所在的字符
S:删除当前行
末行模式
行跳转
:123 -> 跳转到第123行
替换
替换一行:
:s/abc/123 -> 将当前行中的第一个abc替换为123
:s/abc/123/g -> 将当前行中的abc全部替换为123
替换全部:
:%s/abc/123 -> 将所有行中的第一个abc替换为123
:%s/abc/123/g -> 将所有行中的abc全部替换为123
替换指定行:
:10,30s/abc/123/g -> 将10-30行中的abc全部替换为123
执行shell命令
末行模式里输入!,后面跟命令
模式之间的切换
在末行模式下分屏
sp 将屏幕分为<水平>两部分
vsp 将屏幕分为<垂直>两部分
sp(vsp) + 文件名 水平或垂直拆分窗口显示两个不同的文件
wqall 保存并退出所有屏幕
wq 保存并退出光标所在的屏幕
ctrl+ww 切换两个屏幕
gcc(GNU编译器套件)
gcc +参数:
查看版本号 -v
产生目标文件 -o
指定头文件目录 -l +目录
编译时定义宏 -D
编译优化 -On (0-3)
-O0 - 没有优化
-O1 - 缺省值
-O3 - 优化级别最高
提示更多警告信息 -Wall
只编译子程序 -c
生成预处理文件 -E
包含调试信息 -g (gdb调试的时候必须加此参数)
静态库
指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件.
1.命名格式
lib+静态库名+.a
2.使用场景
在核心程序上使用,保证速度,可忽视空间,现在很少使用。
3.优点
1.寻址方便,速度快
2.库被打包到可执行程序中,直接发布可执行程序即可使用
4.缺点
1.静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
2.如果静态函数库改变了,那么你的程序必须重新编译。
5.静态库的制作
(1) gcc +*.c 文件 -c 得到 *.o 文件
(2) 得到静态库 lib----.a
ar rcs lib----.a a.o b.o c.o
通过ar打包工具打包 .o 文件
参数:
r 将文件插入静态库中
c 创建静态库,不管库是否存在
s 写入一个目标文件索引到库中,或者更新一个存在的目标文件索引
查看库中的符号(函数、全局变量等): nm lib----.a
6.使用静态库
1.gcc +源文件 +-L静态库路径 +-l静态库名 +-I头文件目录 +-o可执行文件名
2. gcc + 源文件 + -I头文件 + lib----.a
注意:生成的静态库需要跟对应的头文件同时发布,头文件中存放的是函数接口(函数声明)
动态库(共享库)
1.描述
(1)机制
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
(2)优点
1.节省内存(共享)
2.易于更新(动态链接)
停止运行程序
使用新库覆盖旧库(保证新旧库名称一致,接口一致) “接口”
重新启动程序。
(3)缺点
延时绑定,速度略慢
(4)使用场合
对速度要求不是很强烈的地方都应使用动态库
(5)注意事项
动态库是否加载到内存,取决于程序是否运行。
2.命名格式
lib+动态库名+.so
3.制作
(1)生成“与位置无关”的目标文件
gcc -fPIC *.c文件 -c
参数:
-fPIC 表示生成与位置无关代码,执行完毕后生成一系列的 .o 文件
(2)制作动态库
gcc -shared -o lib----.so a.o b.o c.o
参数:
-shared 制作动态库
-o:重命名生成的新文件
(3)使用动态库
gcc main.c -L./ -l---- -I./ -o app
参数:
-L 指定库所在的路径
-I 头文件目录位置
app 重新生成的文件名
(4)执行生成的可执行文件
gdb调试
1.使用场景
1.程序编译无误,但是有逻辑错误
2.使用文字终端(shell),实现一个单步调试的功能
3.生成可执行文件之前必须加参数 -g
2.启动gdb调试
gdb + 可执行文件
3.gdb相关命令
l 列出文件的代码清单
l + 行号 代码从第n行开始显示
b(break) 设置断点
b + 行号 在第n行设置断点
b + 行号+ 条件 在第n行设置断点,只有满足条件时时生效
info b 查看断点信息
r 运行程序
start 单步执行,运行程序,停在第一行执行语句
disable/enable + 断点号 设置断点是否有效
d + 断点号 删除指定断点号对应的断点
p+ 变量名 打印变量值
display+变量名 追踪变量
undisplay+变量名编号 取消跟踪
n(next) 下一行(不会进入到函数体内部)
s(step) 下一步(会进入到函数体内部)
ptyte + 变量名 查看变量的类型
finish 结束当前函数,返回到函数调用点
set 设置变量的值 set var n=100
q(quit) 退出gdb调试
makefile
1.文件的命名规则
Makefile和makefile
2.用途
1.项目代码编译管理
2.节省编译项目的时间
3.一次编写终身受益
3.基本规则
格式:
目标:依赖
(tab缩进)命令
目标 --> 要生成的目标文件
依赖 --> 生成目标文件需要的一些文件
命令 --> 借助依赖文件生成目标文件的手段
tab --> 缩进,有且只有一个
最简单的makefile:
app:1.c 2.c 3.c 4.c main.c
gcc 1.c 2.c 3.c 4.c main.c -I../include -o app
4.工作原理
1.若想生成目标,检查规则中的依赖条件是否存在,如果不存在,寻找是否有规则用来生成该依赖文件
2.检查规则中的目标是否需要更新,必须检查它的所有依赖,依赖中有任意一个被更新,则目标必须更新。(依赖文件比目标文件时间晚,则需要更新)
5.执行
make 通过makefile生成目标文件
直接 make (使用makefile文件)
make -f -- (指定一个名字不为makefile的文件)
make clean 清除编译生成的中间.o文件和最终目标文件
6.变量
(1)普通变量
1.变量定义及赋值:abc = a.o b.o c.o
2.变量取值:abcd = $(abc)
3.由 Makefile 维护的一些变量
常用的变量名:
CC: 表示c编译器版本
CFLAGS: 表示编译时参数
CPPFLAGS: 表示预处理参数
CXX: 表示C++编译器版本
CXXFLAGS: 表示c++编译时参数
LDFLAGS: 表示库参数库选项
INCLUDE: 表示头文件目录
TARGET: 表示目标名
RM: 删除选项
(2)自动变量
$@ --> 规则中的目标
$< --> 规则中的第一个依赖条件
$^ --> 规则中的所有依赖条件
(3)特殊字符
$(变量):对变量取值
@:只显示命令结果,忽略命令本身
-:如果当前命令出错,忽略错误,继续执行
%:通配符,通配符是以遍历的方式实现的
7.makefile内置函数
注意:makefile中所有的函数必须都有返回值
1.wildcard:按照指定格式获取当前目录下的所有文件名
例:SOURCEFILE=$(wildcard *.c):获取.c后缀的所有文件并返回赋值SOURCEFILE
patsubst:根据指定的格式进行替换(字符串替换)
例:DEFFILE=$(patsubst %.c,%.o,$(SOURCEFILE))
代码
app: main.o a.o b.o c.o d.o
gcc -o app main.o a.o b.o c.o d.o
main.o : main.c
gcc -c main.c
a.o : a.c
gcc -c a.c
b.o : b.c
gcc -c b.c
c.o : c.c
gcc -c c.c
d.o : d.c
gcc -c d.c
clean :
rm app main.o a.o b.o c.o d.o
文件操作
stat函数:获取文件属性
返回值:成功:0 失败:-1