Vim和动静态库
一、vim的三种工作模式
- 命令模式
- 文本输入模式
- 末行模式
二、vim的基本操作
1、命令模式->
编辑模式
输入 | 操作 |
---|---|
i | 插入光标前一个字符 |
I | 插入行首 |
a | 插入光标后一个字符 |
A | 插入行末 |
o | 向下新开一行,插入行首 |
O | 向上新开一行,插入行首 |
s | 删除一个字符,插入字符 |
S | 删除一行,插入字符 |
2、命令模式
移动光标:
输入 | 操作 |
---|---|
h | 左移 |
j | 下移 |
k | 上移 |
l | 右移 |
M | 光标移动到中间行 |
L | 光标移动到屏幕最后一行行首 |
行号 -G | 调转到指定行 |
w | 向下一次移动一个字 |
b | 向上一次移动一个字 |
{ | 按段移动,上移 |
} | 按段移动,下移 |
Ctrl-d | 向下翻半屏 |
Ctrl-u | 向上翻半屏 |
Ctrl-f | 向下翻一屏 |
Ctrl-b | 向上翻一屏 |
gg | 光标移动文件开头 |
G | 光标移动文件末尾 |
0 | 将光标移动到行首 |
$ | 将光标移动到行尾 |
删除(剪切)
输入 | 输出 |
---|---|
x | 删除光标后单个字符,相当于Del(执行结束,工作模式不变) |
X | 删除光标前一个字符,相当于Backspace(执行结束,工作模式不变) |
dw | 删除一个单词,(光标需置于单词的首字母进行操作) |
D或d$ | 删除光标至行尾 |
d0 | 删除光标至行首 |
v | 删除指定区域(使用v切换为“可视”,使用hjkl移动光标选中待删除的区域,按d删除该区域数据) |
dd | 删除光标所在行 |
行数-dd | 删除多行 |
复制粘贴
输入 | 输出 |
---|---|
yy | 复制一行 |
行数-yy | 复制多行 |
p | 将复制的行粘贴(向后) |
P | 将复制的行粘贴(向前) |
替换
输入 | 输出 |
---|---|
r+字符 | (将待替换的字符用光标选中,然后按r,最后按欲替换的字符),替换单个字符 |
查找
输入 | 输出 |
---|---|
/-关键字 | 搜索关键字 |
*或# | 查找看到的关键字 |
撤销
输入 | 输出 |
---|---|
u | 一步步撤销 |
Ctrl-r | 反撤销 |
其他
输入 | 输出 |
---|---|
gg=G | 自动格式化程序 |
% | 大括号对应 |
. | 重复上一次操作的命令 |
>> | 文本行右移 |
<< | 文本行左移 |
跳转至Man Page
输入 | 输出 |
---|---|
n-K | 将光标置于待查看函数单词上,使用n-K(命令模式)跳转。n:指定卷数 |
*或# | 查看代码中的函数等定义 |
查看宏定义
输入 | 输出 |
---|---|
[-d | 将光标置于待查看宏定义单词上,查看定义语句 |
可视模式
输入 | 输出 |
---|---|
ctrl-v | 进入可视模式(行编辑、行多选) |
ctrl-v、ctrl-i | 进入可视模式(列编辑、列多选) |
3、末行模式
其他
输入 | 操作 |
---|---|
:行号 | 跳转到指定行 |
ctrl-p | 切换到上一次的执行命令 |
替换
输入 | 输出 |
---|---|
😒 /被替换数据/替换数据 | 单行替换(将光标置于待替换行上) |
:%s /被替换数据/替换数据/g | 通篇替换(不加g,只替换每行的第一个单词) |
:起始行号,终止行号s /被替换数据/替换数据/g | 指定行的替换(不加g,只替换每行的第一个单词) |
分屏
输入 | 输出 |
---|---|
:vsp | vim分屏(竖) |
:sp | vim分屏(横) |
Ctrl-ww | 分屏切换 |
:q | 退出分屏 |
:qall | 退出所有分屏 |
在末行模式执行shell命令
输入 | 输出 |
---|---|
:!命令 | 执行shell命令 |
三、vim打造IDE
/etc/vim/vimrc
~/.vimrc
~/vimrc #优先级高
显示行号:添加 set number
使用vim命令,内容出现乱码
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
四、gcc编译
1、gcc编译
-E 生成预处理文件
-S 编译,检查语法
-c 只编译,生成.o文件,不进行链接,得到二进制文件
-I 指定头文件目录位置
-g 包含调试信息,编译时添加调试语句。主要支持gdb调试。
-Wall 提示更多警告信息
-D<DEF> 编译时“动态注册”定义宏(可以在调试信息的时候使用)
-On n=0~3 编译优化,n越大优化越多,(在嵌入式中可以能用)
2、gdb调试工具
run调试
-g 使用该参数编译可执行文件,得到调试表
gdb a.out
list/l list 1: 列出源码。根据源码指定行号设置断点
break/b b 20:在20行位置设置断点
run/r 运行程序/查找“段错误”出现位置
run 字串1 字串2 ... 设置main函数命令行参数
next/n 下一条指令(会越过函数)
step/s 下一条指令(会进入函数)
print/p p i:查看变量的值
until until 16 执行到16行
continue 继续执行断点后续指令
quit 退出当前调试
start调试
start 单步调试
finish 结束当前函数调用
set args 设置main函数命令行参数(在start之前开始使用)
其它命令
info b 查看断点信息表
b 20 if i = 5 设置条件断点
delete 20 删除断点
ptype p 查看变量类型
display i 设置跟踪变量
undisplay 编号 取消设置跟踪变量(使用变量的编号)
栈帧(与函数调用相关)
backtrace/bt 查看函数的调用的栈帧和栈帧编号
frame 切换函数的栈帧编号
五、动态库和静态库
1、动态库和静态库区别
2、静态库的制作及使用步骤
-
将
.c
生成.o
文件gcc -c add.c -o add.o
-
使用ar工具制作静态库
ar rcs lib库名.a add.o sub.o div.o
-
编译静态库到可执行文件中:
gcc test.c lib库名.a -o a.out
-
静态库需要头文件:
gcc test.c ./lib/lib库名.a -o a.out -I ./inc
3、动态库制作及使用
-
将
.c
生成.o
文件(生成与位置无关的两码 -fPIC)gcc -c add.c -o add.o -fPIC
-
使用
gcc -shared
制作动态库gcc -shared lib库名.so add.o sub.o div.o
-
编译可执行程序时,指定所使用的动态库。
-l
:指定库名(去掉lib前缀和.so后缀)-L
:指定库路径。
gcc test.c -o a.out -l库名 -L库路径
-
运行可执行程序
./a.out
出错!!!
error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or dirrectory
原因:
链接器:工作于链接阶段,工作时需要`-l`和`-L` 动态链接器:工作程序运行阶段,工作时需要提供动态库所在目录位置。
解决方式:
1. 通过环境变量: `export LD_LIBRARY_PATH=动态库路径`(临时生效:环境变量是进程的概念,终端重启环境变量失效)
2. 永久生效:写入终端配置文件。
1. `vi ~/.bashrc`
2. 写入`export LD_LIBRARY_PATH=动态库路径`(建议使用绝对路径)保存
3. `. .bashrc` `source .bashrc` 重启终端 ----> 让修改后的.bashrc生效
3. 拷贝自定义动态库到/lib(标准C库所在的目录位置,不推荐)
4. 配置文件法
1. 修改/etc/ld.so.conf`sudo vi /etc/ld.so.conf`,添加共享库路径
2. 更新查找共享库的路径`sudo ldconfig -v`
3. 测试你的程序可否找到共享库`ldd a.out`