《Linux系统编程笔记》----DAY01
VIM基本操作
跳转
-
跳转到指定行:
- 1.88G(命令模式)
- 2.:88(末行模式)
-
跳转到文件首
gg(命令模式)
-
跳转文件尾
- G(命令模式)
-
光标移至行首:
- 0(命令模式)
-
光标移至行尾:
- $(命令模式)
-
自动格式化程序
- gg=G
-
大括号对应
- %(命令模式)
-
跳转至man手册:
将光标置于待查看函数单词上,用NK(N是第几卷)
-
查看宏定义:
将光标置于待查看宏定义单词上,[d查看定义语句
删除/替换
-
删除一个字符
- x(命令模式)
-
删除一个单词
- dw(命令模式)光标要放在首字母
-
删除光标至行尾
- D(命令模式)或者d+$
-
删除光标至行首
- d0(命令模式)
删除指定区域:
按v(命令模式)切换为“可视模式”,选中要删除的区域,按d删除
删除指定一行
在光标所在行,按dd
删除多行
Ndd
复制粘贴
复制一行
yy(命令模式)
p粘贴(光标所在下一行)
P(粘贴)(光标所在上一行)
查找和替换
- 1.找设想的内容
末行模式下按“/”输入要查找的单词 回车 n下一个
- 2.找看到的内容
命令模式下,将光标置于单词任意一个字符上,按“*”或"#"
-
3.替换
-
替换单个字符 ----r(命令模式)
-
- 3.1单行 末行模式,按 s /要替换的内容 /待替换的内容
-
- 3.2区域替换 末行模式,起始行号,终止行号 /要替换的内容 /待替换的内容/g
-
- 3.3通篇 末行模式 ,按%s /要替换的内容 /待替换的内容/g ,g不加,就是替换第一个
-
-
撤销 u
-
反撤销 ctrl+r
-
显式行号 :set number
末行模式 sp +回车(横屏) 切屏:ctrl+ww
末行模式 vsp+回车(竖屏) 切屏:ctrl+ww
在末行模式下执行shell命令
:!命令 :!ls-l
gcc相关
gcc编译可执行程序四步骤
1.预处理(gcc -E):展开宏,头文件,替换条件编译,删除注释,空行,空白
2.编译(gcc -S):检查语法规范【消耗时间,系统资源最多】
3.汇编(gcc -c):将汇编指令翻译成机器指令
4.链接(无参数):数据段合并,地址回填
hello.c---预处理-->hello.i----编译---->hello.s-----汇编------>hello.o-----链接------>a.out
gcc常用参数
-I 指定头文件所在目录位置
-c 只做预处理,编译,汇编。得到 二进制文件!(.o文件)
-g 编译时添加调试文件。主要支持gdb调试
-On n=0~3;编译优化,优化等级(默认2级),n越大优化越多
-Wall 显式所有警告信息
-D 向程序中,“动态”注册宏定义
-L 指定库位置
静态库和共享库
静态库:对空间要求较低,而时间要求较高
共享库:对空间要求较高,而时间要求较低
制作静态库
1.将 .c生成 .o文件
gcc -c add.c -o add.o
2.使用ar工具生成静态库
ar rcs libmylib.a file1.o
3.编译静态库到可执行文件中
gcc test.c lib库名.a -o a.out
制作动态库
1.将.c生成.o文件(生成与位置无关的代码 -fPIC)
gcc -c add.c -o add.o -fPIC
2.使用 gcc -shared 制作动态库(.so文件)
gcc -shared -o lib库名.so add.o sub.o
3.编译可执行程序时,指定所使用的动态库。-l:指定库名(去掉lib前缀和.so后缀),-L:指定库路径
gcc test.c -o a.out -l mymath -L ./lib
4.运行可执行程序 ./a.out出错
* 原因:
链接器 工作于链接阶段,工作时需要 -l和-L
动态链接器 工作于层序运行阶段,工作时需要提供动态库所在目录位置
【1】通过环境变量改变:export LD_LIBRARY_PATH=动态库路径
【2】永久生效:写入 终端配置文件。 .bashrc
1)vi ~./bashrc
2)写入export LD_LIBRARY_PATH=动态库路径
3). .bashrc/ source .bashrc /重启 终端----->让修改后的.bashrc生效 *
【3】修改/etc/ld.so.conf
1.sudo vi /etc/ld.so.conf
2.添加你的共享库路径
3.更新查找共享库的路径
sudo ldconfig -v
4.测试程序可否找到共享库
ldd a.out
扩展——数据段合并(链接时合并)
【好像我记得上面的步骤有问题,下次使用记得的再补充】
gdb调式工具
-g :使用该参数编译可执行文件,得到调试表
gdb a.out
list:list 1 列出源码。根据源码指定 行号设置断点
b: b 20 在20行设置断点
r: 运行程序
n: 下一条指令(会越过函数)
s: 下一条指令(会进入函数)
p: 查看变量的值
continue:继续执行断点后续指令
quit:退出gdb当前调试
finish:结束当前函数调用
gdb其他指令
出现段错误,解决方法:
run:使用run查找段错误位置
set args:设置main函数命令行参数
run 字串1 字串2 ...:设置main函数命令行参数
info b:查看断点信息表
b 20 if i=5:设置条件断点
ptype:查看变量类型
bt:列出当前程序正存活着的栈帧(形参和局部变量都在栈帧上)
frame:根据栈帧编号进行切换
display:跟踪变量值,undisplay 取消跟踪
set follow-fork-mode child 命令设置gdb在fork之后跟踪进程
set follow-fork-mode parent 设置跟踪父进程
makefile项目管理
命名:makefile Makefile ------make命令
1个规则:
目标:依赖条件
(一个tab缩进)命令
-
目标的时间必须晚于依赖条件的时间,否则,更新目标
-
依赖条件如果不存在,找寻新的规则去产生依赖
ALL:指定makefile的终极目标
2个函数:
src=$(wildcard *.c)
找到当前目录下所有后缀为.c的文件,赋值给src(src=add.c sub.c div.c)
obj=$(patsubst %.c,%.o,$(src))
将参数3中,包含参数1的部分,替换为参数2(obj=add.o sub.o div.o)
clean:(没有依赖)
-rm -rf $(obj) a.out
“-”作用是:删除不存在文件时,不报错。顺序执行结束
3个自动变量
$@:在规则的命令中,表示规则中的目标
$<:在规则的命令中,表示第一个依赖条件。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖一次取出,套用模式规则
$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的规则消除重复项
模式规则:
%.o:%.c
gcc -c $< -o $@
静态模式规则:
$(obj):%.o:%.c
伪目标:
.PHONY:clean All
参数:
-n : 模拟执行make,make clean命令
-f: 指定文件执行make命令