一.vim编辑器
编译器有vim、gedit、vscode等;
1.vim的安装
联网条件下终端输入指令:sudo apt-get install vim
2.vim的使用
终端输入指令:vim 文件名 (如果文件存在,只打开,文件不存在,创建并打开。)
3.Vim中的四种模式:
命令模式,插入模式,底行模式,可视模式
1)命令模式:
可以用来复制,粘贴,删除,剪切等
直接 vim 打开文件,默认就是命令模式;
不管当前是什么模式,按esc键就可以快速回到命令模式
复制命令:
yy -- 复制光标所在位置的一整行;
nyy -- 复制光标所在位置往下n整行;
yw -- 复制光标所在位置的一个单词;
nyw -- 复制光标所在位置往后的 n 个单词;
粘贴命令:
P – 粘贴
删除/剪切命令:
x -- 删除光标所在位置的单字符;
X -- 删除光标所在位置的前一个位置的单字符;
dd -- 删除/剪切光标所在位置的一整行;
ndd -- 删除/剪切光标所在位置的往下的 n 整行;
dw -- 删除/剪切光标所在位置的一个单词;
ndw -- 删除/剪切光标所在位置的往后的 n 单词;
d$ -- 删除/剪切光标所在位置到行尾的所有内容;
d^ -- 删除/剪切光标所在位置到行首的所有内容;
撤销命令:
u
反撤销命令:
Ctrl+r
其他:
gg -- 光标快速回到文件开头
G -- 光标快速回到文件末尾
gg=G -- 文件中的内容会格式化对齐
2)插入模式:
用于编写代码
首先要退回命令模式,然后再输入(以下任意一个字符):i、I、a、A、o、O(大写o);
i:插入到光标所在位置(使用较多)
I:插入到光标所在位置的行首
a:插入到光标所在位置的下一个位置
A:插入到光标所在位置的行尾
o:插入到光标所在位置的下一行
O:插入到光标所在位置的上一行
3)底行模式:
可用于字符串的替换,查找,保存,退出等
方式1:先esc键退回到命令模式,再输入:(英文冒号,需要使用shift键)键,可以切换到底行模式
相关操作:
保存:w(加回车键)
退出:q(回车键)
保存并退出:wq(回车键)
强制退出:q!(回车键)
文本替换:
整体替换 : %s /原来的字符串/新的字符串/g
部分替换 : m,ns /原来的字符串/新的字符串/g
整行换位置:xmy 将第x行,移动到第y行的后边
方式2:先退回命令模式,再输入/,可以切换到底行模式
字符串查找:
/字符串(回车键)
n往后面继续查找
N往前面继续查找
4)可视模式:
可以用于复制、剪切
先回到命令模式,再输入v,切换到可视模式
y -- 复制;d -- 剪切;x -- 删除
二.编译器gcc
1.编译流程:
从main.c到可执行程序main的过程
第一步、预处理:gcc -E main.c -o main.i
第二步、编译(转汇编):gcc -S main.i -o main.s
第三步、汇编(转二进制):as main.s -o main.o
第四步、链接(链接库):gcc main.o -o main
2.gcc的相关指令
-c:只编译,不链接,相当于编译流程的前三步;
-o:重命名;
-l(大写的i):后面跟头文件路径;
-l(小写的L):后面跟库名;
-L:后面跟库路径(即使是当前路径也要加);
-g:生成带有调试信息的可执行程序
(注:如果用gdb调试,需要加参数-g,例gcc -g main.c默认生成的可执行程序是a.out,但此时生成的a.out就带有调试信息)
三.封装库
为了保护源码,方便移植;
一般情况下工程文件中都含有include(存放.h文件)、lib(存放.o文件)、output(main可执行文件)、src(存放.c文件)、kakefile;
Linux下库的分类:静态库、动态库
1.静态库:
以空间换时间:在生成可执行程序的时候,复制了一份库到当前的可执行程序中,生成的可执行程序较大,浪费了空间,但是节省时间;
编译流程:
第一步:准备功能函数(不能包含main函数):Fun.c;
第二步:将功能函数的.c只编译不链接,生成.o;
gcc -c Fun.c -o Fun.o
第三步:ar -rc libXXX.a *.o (XXX=库名)
验证库:
方式1:.h文件没有封装在一起
gcc main.o -o mian -lXXX -L./
方式2:.h文件封装到include中,需要指明头文件路径
gcc main.c -I./include -lXXX -L./
2.动态库:
以时间换空间:在生成可执行程序的时候,保留了库中函数的入口到当前的可执行程序中,在真正运行的时候,去相应的库里执行函数,浪费了时间但是节省空间;
编译流程:
第一步:准备功能函数(不能包含main函数):Fun.c
第二步:将功能函数的.c只编译不链接,生成.o
gcc -c -fpic Fun.c -o Fun.o
第三步:打包成库;
gcc -shared -fpic -o libXXX.so *.o (XXX=库名)
验证库:
第一步:将库放到指定路径下: sudo mv 整个库名 /usr/lib
第二步:gcc main.c -o main -lXXX -I./include
四.Gdb调试程序
第一步:使用gdb调试工具,在编译的时候gcc后面需要带-g,生成带有调试信息的可执行程序
第二步:启动gdb
格式:gdb ./可执行程序
退出:quit或者q
清屏:ctrl + l
显示:
list或者l //显示代码 10 行
list 行号 //显示该行附近的 10 行
运行:run
设置断点:断点,运行到该行会暂停
break 行号 //( b 行号)
查看断点:info break //(info b)
设置断点: 默认是使能状态
使能:使该断点起作用
enable 断点的编号
失能:使该断点失去作用,不起作用
disable 断点的编号
删除断点:
delete 断点的编号
clear 断点的行号
继续运行:cont或c
打印变量的值:print 变量名
调试程序思想1:
设置断点 + run + print + c
调试程序思想2:单步调试(整体思想:用n来把控全局,遇到自己想进入的子函数的时候,再使用s进入)
运行:start
n(next):下一步,按步调试,遇到函数,不会进入函数内部
s(step):下一步,按步调试,遇到函数,会进入函数内部
finish:结束当前函数,返回到调用点;
五.makefile
工程管理工具:名字为 makefile 的文件,将你原本给终端写的指令,写入到该文件中,make之后自动执行makefile中的指令。
Makefile 是一个用于自动化构建(包括编译和链接)软件项目的文件。它通常与 make 工具一起使用,make 是一个在 Unix 和类 Unix 系统(如 Linux)中广泛使用的构建工具。通过编写 Makefile,开发人员可以定义构建过程的规则,从而简化构建流程并提高开发效率。
安装makefile:
终端输入下载指令(联网):sudo apt-get install make
makefile 的使用
我觉得使用makefile最主要是分析好目标和依赖。分析怎样通过依赖来得到目标,更容易明白去写相关的文件,或者分析文件。
终端输入指令:vim makefile (表示打开或创建并打开一个 makefile 文件)
(注:需要严格按照makefile格式去编写代码)
格式 1:
目标:依赖
(输入tab键)命令
格式 2: 没有依赖的目标, 称为伪目标
目标:
(输入tab键)命令
#表示注释
makefile中的变量:
变量名=原来的内容 例C=gcc
变量的引用: $(变量名) $(C) 等价于 gcc
特殊变量:
$@: 目标
$^: 所有的依赖
$<:所有依赖中的第一个依赖
%.o:%.c
gcc -c $< -o $@
打印变量的值:
echo $(变量名)
@:运行,但是不打印该行指令
makefile 的运行:
方式 1: 直接 make , 默认生成的一定是第一个目标
方式 2: make 目标 , 就是生成该目标
比如: make clean
make echo
makefile 的命名:
直接 make:默认在当前路径下,找makefile这个文件,如果找不到makefile,就找Makefile;如果要用其他名字,需要用-f指定
格式:make -f 其他名字的makefile
六.拓展makefile其它的函数
1.wildcard
原型:$(wildcard <pathname>)
功能:查找<pathname>下指定文件
返回:包含路径的所有指定文件
SRCPATH=$(wildcard ./src/*.c)
$(SRCPATH) 等价于 src/main.c src/add.c src/del.c
2.notdir
原型:$(notdir <names...>)
功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分。
返回:返回文件名序列<names>的非目录部分
SRCNOPATH=$(notdir $(SRCPATH))
$(SRCNOPATH) 等价于 main.c del.c add.c
3.patsubst
原型:$(patsubst <pattern>,<replacement>,<text>)
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则<replacement>替换。<pattern>可以包括通配符“%”,表示任意长度的字串,按照名字匹配。
返回:函数返回被替换过后的字符串
LIBPATH = $(patsubst %.c ./lib/%.o $(SRCNOPATH))
$(LIBPATH) 等价于 ./lib/main.o ./lib/add.o ./lib/del.o