一、文本编辑器-vim + vscode(使用并配置vim、安装以及使用插件+远程连接vscode)
1、vi/vim/gvim:文本编辑器 gedit emac(脱离鼠标)
1.适用场景:单文件编辑;vim+插件(高度定制) > IDE
2.vim模式:命令行(初次进入,按‘a’,‘i’进入插入模式)、底行模式(在命令行输入':'进入底行模式,‘wq’保存退出)、插入模式(摁‘esc’切换为命令行模式)
3.vim配置(vimrc):
修改 /etc/vim/vimrc文件(行号、缩进风格、鼠标支持)
安装插件
4.vim使用
①命令行下:
yy + p - 复制后粘贴
dd - 删除
u - 恢复上一步
等
②底行模式下:
查找 - /*** 或者 ?***
替换 - s/a/b (用b替换a) 只替换第一次出现的a,后面加个/g则替换整行;前面加 i,j 代表替换范围在i到j之间 ;用 %s/a/b/g 表示全文替换;s/a/b/gc 挨个询问是否需要替换
编辑多个文件:vim 文件1 文件2 文件3 跳转:n文件名
文件保存 - w r
多文件编写 - sp+文件名
2、优秀第三方编辑器
sublime、notepad++、vscode
3、IDE
QtCreator、vs2019
二、编译器-gcc(常用编译选项,静态库和动态库的制作与使用)
1.gcc概述:GNU计划提供的编译器(Linux cc编译器)(编译工具链--交叉编译工具链)
2.什么是交叉编译?.c --> .s -->.o --> elf
a.源文件到可执行文件经历哪几个步骤?(预处理、编译、汇编、链接)
b.预处理的任务:头文件展开(#include)、宏替换(#define)、条件编译(#ifdef)(#开头的代码)
c.编译的任务:检查语法,转成汇编,生成汇编文件(.s/S)
d.汇编的任务:编译汇编文件,生成目标文件(.o)
e.链接的任务:链接所有目标文件,生成符号表,生成可执行文件
交叉编译:在宿主机下编译出在目标机下运行的代码的过程(在当前CPU平台下编译出在其他CPU平台运行的代码的过程)
3.编译选项:
-o (可执行重命名:elf格式)
-E (编译器只进行预处理)
-I (大写i)(指定头文件的第三方搜索路径)
-S (进行编译阶段)
-c (进行汇编阶段)
-O1 -O2 -O3 (编译优化)
-w -Wall(开关警告信息)
4.静态库和动态库的制作与使用
①库函数(保存在库文件):printf、scanf、strcpy、strcat
②库文件:保存函数和变量,里面的函数和变量只能使用,但是看不到其实现
库文件的分类:
静态库.a:保存的函数和变量,在编译阶段加载到可执行文件中
动态库.so:保存的函数和变量,在执行阶段加载到可执行文件中
使用静态库和动态库的区别(可执行文件的区别)
a.使用静态库编译出来的可执行文件大小 > 使用动态库编译出来的可执行文件大小 --> 内存的开销
b.使用静态库编译出来的可执行文件执行速度 > 使用动态库编译出来的可执行文件执 行速度
c.使用静态库编译出来的执行文件升级 < 使用静态库编译出来的执行文件升级
d.使用静态库编译出来的执行文件程序部署 > 使用静态库编译出来的执行文件程序部署
③库文件的存放路径(编译时,编译器会自动到这两个目录里找需要链接的库文件):
系统运行所需要的库文件: /lib
第三方软件和工具运行所需要的库: /usr/lib
④制作静态库
a.将目标源文件编译成目标文件; gcc -c 目标源文件
b.使用ar工具生成制作静态库; ar -rcs 所要生成的库文件名字 目标文件(lib+库名+后缀.a)(rcs:库不存在就创建,存在就更新)
例如: ar -rcs libabb.a add.o
⑤使用静态库
-l(小写L):指定加载哪个静态库 (-l库名)
-L:指定加载的库文件的第三方搜索路径
例如:gcc 源文件 -l库名 -L库存放的路径
⑥动态库的创建
gcc -shared -fPIC -o 库名.so 源文件.c
⑦动态库的使用
gcc 源文件.c ./库名.so -o 可执行文件
三、调试器-gdb(断点调试、查看内存、调试内存错误)
gdb是GNU发布的一款功能强大的程序调试工具
gdb主要完成下面三个方面的功能:
1.启动被调试程序
2.让被调试的程序在指定的位置停住
3.当程序被停住时,可以检查程序状态-变量值
学会GDB的三步走:
1、学会使用GDB(基础命令)
run :在调试器中运行程序
list :查看程序源码
break+行号 :设置断点
break+行号+if条件 :设置断点
break+函数名 :设置断点
info break :查看断点信息
delete+断电编号 :删除断点
enable/disable :使能断点
print+变量名 :查看变量值
next :单步执行,不进入子函数
step :单步执行,进入子函数
continue :继续执行,知道遇到下个断点
finish :继续执行,在函数内部时,执行到函数结束
call + 变量名 :调用函数
print + 变量 = 值 :设置变量的值
clear :清除所有断点
ptype + 变量 :查看变量类型
gdb + 可执行文件 + --tui :启动图形化调试串口
layout asm :显示汇编
layout src :显示源代码
layout split :显示源代码+汇编程序
2、掌握GDB的场景的使用技巧(多任务、网络程序、内存管理、core、汇编程序)
3、实现GDB(实现一个调试器:应用程序)
四、工程管理器-make(编写makefile,多目录的makefile编写)
1、什么是工程?
多个源文件+其他文件(图片+头文件+脚本文件)
2、工程管理器的作用?
编译多个源文件?----- gcc+所有源文件 -o —> 可执行文件 ----> 工程管理器的作用就是可以实现自动编译
3、make的依赖于makefile文件
4、makefile文件是一种脚本文件(批处理),存在相关语法
5、makefile语法:
①三要素:目标、依赖、命令
②格式:
目标:依赖
(tab)命令
ps:目标:最终生成的文件;依赖:生成目标时所需要的文件;命令:生成目标时,需要执行的命令
6、make执行顺序;
make:默认从第一个目标执行
make+目标体:从对应的目标体执行
如果目标体后面依赖的文件是一个目标的话,先执行对应的目标,再执行目标体的命令
$@ | 表示目标文件的名称,包含扩展名 |
$^ | 表示所有的依赖文件,以空格隔开,不重复 |
$< | 表示第一个依赖文件的名称 |
$+ | 表示所有的依赖文件,空格隔开,可以重复 |
$* | 表示目标文件的名称,不包含扩展名 |
$? | 依赖项中,所有比目标文件新的依赖文件 |
7、多级目录下的makefile
1.顶层makefile:总控makefile
进入各个功能子目录下执行make命令,将各个子目录下的.o文件链接成可执行文件
2.子目录makefile:功能makefile
将当前目录下的.c文件编译生成.o文件
3.scripts目录下makefile:头文件makefile
定义一些变量
五、shell编程
1、shell编程的定义
Shell是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
2、程序基础
1.程序必须以下面的行开始(必须放在文件的第一行)
#!/bin/sh :#!迎来告诉系统它后面的参数是用来执行该文件的程序
2.要使脚本可执行:
chmod + x 文件名 然后,可以通过输入:./文件名 来执行脚本
3、变量
shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。
赋值: 变量名=值 (=两边不能有空格)
取出变量则在变量名前加一个美元符号($)
默认变量
$# | 传入脚本的命令行参数个数 |
$* | 所有命令行参数值,在各个参数值间留有空格 |
$0 | 命令本身(shell文件名) |
$1 | 第一个命令行参数 |
$2 | 第二个命令行参数 |
4、语句
if语句
If [expression]
then
#code block
fi
If [expression]
then
#code block
else
#code block
fi
If [expression]
then
#code block
else if [expression]
then
#code block
else
#code block
fi
fi
for语句
for var in [list]
do
#code block
done
其中var是循环控制变量, [list]是var需要遍历的一个集合,do/done包含了循环体,相当于c语言中的大括号。另外do和for被写在同一行,必须在do前面加上“;”如:for var in [list];do
while 语句
while [condition]
do
#code block
done
until 语句
until [condition]
do
#code block
done
while和until的区别在于while为真时执行,until为假时执行;
case语句
case “$var” in
contidion1)
;;
contidion1)
;;
*)
default statements;;
esac