一、vim编辑器
a、vim安装
离线安装:dpkg -i rpm
在线安装:apt-get instsall vim
配置vim路径:sudo gedit /etc/vim/vimrc
b、常用命令
打开操作:vim filename
vim+行号 filename
1.命令模式
文本删除
n 代表操作的个数
命令 | 说明 |
---|
d0 | 删除从光标前一个字符到行首内容 |
D或d$ | 从光标到行尾 |
(n)x | 删除光标处的字符(n代表向右要删除的字符数) |
(n)X | 删除光标前的字符(n代表光标前字符向左要删除的字符数) |
(n)dd | 删除光标所在行(n代表要删除的行数) |
(n)dw | 删除一个单词(n代表要删除的单词数) |
文本复制
命令 | 说明 |
---|
(n)yy | 复制光标所在行(n代表当前及后n-1行) |
Y | 复制光标所在行 |
(n)yw | 复制一个单词(n表示复制指定的n个单词) |
命令 | 说明 |
---|
p | 粘贴当前缓冲区内容 |
u | 撤销指令 |
Ctrl r | 返撤销 |
屏幕滚动
命令 | 说明 |
---|
Ctrl + u | 将屏幕向前翻滚半屏幕 |
Ctrl + d | 将屏幕向后翻滚半屏幕 |
Ctrl + f | 将屏幕向后翻滚一屏幕 |
Ctrl + b | 将屏幕向前翻滚一屏幕 |
指针行跳变
命令 | 说明 |
---|
n+enter | 下移动n行 |
0 | 本行开头 |
$ | 本行行尾 |
nG | 光标移动到n行 |
gg 、G | 跳 开始、结尾 |
gg==G | 快速对齐代码 |
2.插入模式
插入文本命令
追加文本命令
空行插入命令
按esc进入命令行模式
命令 | 说明 |
---|
i | 将文本插入到光标所在位置 |
I | 将文本插入到当前行首 |
a | 将文本加到光标所在位置之后 |
A | 将文本追加到所在行尾 |
o | 在光标所在行下面添加空行 |
O | 在光标所在行上面添加空行 |
3.底行模式
退出指令
搜索字符串
字符串替换
命令 | 说明 |
---|
q! | 强制退出不保存 |
w | 只保存 |
w! | 强制保存不退出 |
wq | 先保存在退出 |
shift+: | 进入命令行模式 |
shift+zz | 强制退出 |
x | 若修改保存退出否则直接退出 |
/字符串 | 从光标开始向后搜索 n:往下找 N:往上找 |
?字符串 | 从光标开始向前搜索 |
%s /源字符串/目标字符串/g | |
4.可视模式
命令模式下v进入可视模式
d:删除 y:复制 x:剪切
二、vim编译器
程序编译过程
a.编译预处理 gcc –E xxx.c –o xxx.i
b.编译 gcc -S xxx.i -o xxx.s
c.汇编 as xxx.s -o xxx.o
d.链接 gcc xxx.o -o xxx
a.处理伪指令(#)和特殊的特殊符号
伪指令包括:1)宏定义指令;2)条件编译指令;3)头文件包含指令;
b.把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件
c.汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句对应一条机器指令
d.头文件只是函数声明,实现封装在库文件中,链接就是找到指定路径下的库文件
常用编译选项
1、没有任何选项:gcc helloworld.c
2、-o选项,指定输出文件名:gcc -o helloworld helloworld.c
3、-c选项,只编译,不链接:gcc -c helloworld.c
4、-S选项,使用预处理C源文件产生的文件,产生汇编源文件:gcc -S helloworld.c
5、-E选项,预处理C源文件:gcc -E helloworld.c
6、-g选项,产生供gdb调试用的可执行文件:gcc -g helloworld.c
三、动态库和静态库
a.静态库的创建
1.准备功能函数的源文件 main.c xxx.c yyy.h 如:main.c fun.c fun.h
2.只编译不连接,生成目标文件 gcc -c xxx.c -o xxx.o 如:gcc -c fun.c -o fun.o
3.打包生成静态库 ar -rc libxxx.a xxx.o yyy.o 如:ar -rc libfun.a fun.o
4.利用静态库编译程序 gcc main.c -lxxx -L./ 如:gcc main.c -lfun -L./
-l:指明用到的库文件
-L:库文件所在的的路径
b.动态库的创建
1.准备功能函数的源文件 xxx.c yyy.c zzz.h 如:main.c fun.c fun.h
2.只编译不连接,生成目标文件 gcc -fpic -c fun.c -o fun.o
----64位系统,需要加-fpic
3.打包生成动态库 gcc -fpic -shared xxx.o yyy.o -o libxxx.so 如:gcc -fpic -shared fun.o -o libfun.so
4.利用动态库编译程序 编译应用程序 gcc main.c -lxxx -L./
-l:指明用到的库文件
-L:库文件所在的的路径
注:系统只会到默认的路径下去寻找动态库
默认的库路径:lib或者usr/lib
区别:
静态库 .a
动态库 .so
静态库:直接将库文件编译到可执行程序里面
动态库:动态去lib usr/lib 下去寻找需要的库文件加载
ldd a.out:查询a.out程序运行需要的库文件
四、调试工具gdb
a.为何需要gdb:根据IEEE研究,每个重要软件最初都有缺陷,一般来说没100行有2个左右
b.常用调试技巧
测试:找出程序中存在的缺陷或错误
固化:让程序的错误可重现
定位:确定相关的代码行
纠正:修改代码纠正错误
验证:确定修改解决了问题
如何使用gdb去调试程序
1.在编译的时候加入调试信息 gcc -g xxx.c -o xxx
2.启动gdb调试
3.开始调试 ---常用调试命令
列出当前文件:l(即list)
加入断点:b(breakpoint) + linenum
开始执行:r(run) ---- 程序会停在断点处
查看变量:p + 变量名
继续运行到下个断点处:c(cont)
启动调试:start -- 程序停在main的第一行
逐步执行:next -- 遇到函数直接得到函数结果
逐步执行:step -- 遇到函数跳到函数内部
注:不能跳转到第三方函数,因为第三方函数没有加入调试信息
注:next遇到函数直接执行得到结果,step进入函数内部,一步一步执行
结束函数:finish --跳出函数,直接得到函数结果
失能断点:disable + 断点号
使能断点:enable + 断点号
删除断点:delete breakpoint + 断点号
clear + 行号
结束调试:quit
四、工程管理工具make
make:相当于脚本编程语言;本质是实现自动化编译;需要makefile或者Makefile文件支持
指定makefile文件:make -f xxx
make是什么?
按照事先写好的编译规则,自动去执行编译过程。而规则就是写在makefile文件里的“信息”。我们可以将编译顺序(规则)写在Makefile文件中;然后我们只需要输入一个make。它就会自动的执行规则从而编译整个工程。
makefile
作用:告诉make 应该如何去构造相应的应用程序
构成:
依赖关系
作用:定义最终应用程序中的每一个文件与源文件之间的关系
语法结构:make要创建的目标名称+冒号+空格或tab+用空格或tab隔开的文件列表
特殊目标名称:all(伪目标);all后面列出所有从属目标;all: myapp myapp.1
规则
作用:定义了目标的创建方式
语法结构:tab+规则,如tab+gcc -c main.c
注意:开头的tab不能用空格或多个空格代替,行---不能以空格结尾
注释:以#开头
宏:make命令内置特殊宏
$@:目标文件
$^:所有的依赖文件
$<:第一个依赖的文件
如何实现自动化编译一个工程?
1. 建立Makefile文件
2. 在Makefile(makefile)文件中编写编译规则
make的语法规则:
目标:依赖 -----顶格写
指令 -----以tab键开头
3. make --在命令行输入make,
make会自动执行Makefile中的规则
注意:make如何判断是否执行某一规则
1. 是否有这个目标文件
2. 该目标文件是否被更新
例:
main:main.o
gcc main.o -o main
main.o:main.s
as main.s -o main.o
main.s:main.i
gcc -S main.i -o main.s
main.i:main.c
gcc -E main.c -o main.i
clean:
rm *.o *.s *.i main -rf
led.o:main.c led.c
gcc main.c led.c -o led.o
clean:
rm *.o *.so -rf
CC = gcc
led:main.c fun.c
$(CC) $^ -o $@
clean:
rm *.o led -rf