Linux系统编程(二)Vim、动静态库、gcc编译

Vim和动静态库

一、vim的三种工作模式

  1. 命令模式
  2. 文本输入模式
  3. 末行模式

二、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,只替换每行的第一个单词)

分屏

输入输出
:vspvim分屏(竖)
:spvim分屏(横)
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、静态库的制作及使用步骤

  1. .c生成.o文件 gcc -c add.c -o add.o

  2. 使用ar工具制作静态库 ar rcs lib库名.a add.o sub.o div.o

  3. 编译静态库到可执行文件中:gcc test.c lib库名.a -o a.out

  4. 静态库需要头文件:gcc test.c ./lib/lib库名.a -o a.out -I ./inc
    静态库需要头文件

3、动态库制作及使用

  1. .c生成.o文件(生成与位置无关的两码 -fPIC)gcc -c add.c -o add.o -fPIC

  2. 使用gcc -shared制作动态库gcc -shared lib库名.so add.o sub.o div.o

  3. 编译可执行程序时,指定所使用的动态库。-l:指定库名(去掉lib前缀和.so后缀) -L:指定库路径。
    gcc test.c -o a.out -l库名 -L库路径

  4. 运行可执行程序./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`

4、数据段合并

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值