Linux 学习记录39(C高级篇)
本文目录
- Linux 学习记录39(C高级篇)
- 一、gdb调试工具
- 1. gdb工具的使用
- 二、枚举类型 enum
- 1. 定义
- 三、Makefile
- 1. 什么是makefile
- 2. 什么是Make
- 3. Make用途
- 4. Makefile的工作过程
- (1. Makefile分步编译的目的
- 5. Makefile的语法规则
- 6. Makefile变量的赋值
- (1. 递归赋值
- (2. 追加赋值
- (3. 立即赋值
- (4. 条件赋值
- 6. Makefile自动变量
- 7. Makefile伪目标
- 8. Makefile通配符
- 8. Makefile内置函数
- (1. wildcard
- (2. patsubst
- 四、
- 思维导图
一、gdb调试工具
用于查找程序中的非语法错误
1. gdb工具的使用
需要在编译时加上参数,生成可以调试的debug的文件
gcc -g xxx.c 生成可以调试的可执行文件
gdb 可执行文件名 进入gdb工具
进入gdb工具后
- l:显示我加你前十行,如果我加你超过十行,再按一下l
- b 行数/函数名:打断点
- r:执行程序默认停在断点处
- n:单步执行,遇到函数不会进入函数内部
- s :单步执行,遇到函数会进入函数内部
- p 变量名 :打印变量
- q :退出gdb工具
二、枚举类型 enum
1. 定义
enum 类型名
{
枚举项1,
枚举项2,
枚举项3,
...
枚举项n,
};
1. 枚举项能直接使用
2. 枚举项默认整形常量
3. 能够给枚举项直接赋值
4. 枚举项值是按顺序递增的
5. 枚举是适用于typedef类型重定义的
6. 枚举一般用于数据间有相互关系并连续的
例:
enum week
{
mon=1,
tue,
wed,
tus,
fri,
sat,
sum,
};
int main(int argc, char const *argv[])
{
printf("%d\r\n",mon);
printf("%d\r\n",tue);
printf("%d\r\n",wed);
printf("%d\r\n",tus);
printf("%d\r\n",fri);
printf("%d\r\n",sat);
printf("%d\r\n",sum);
return 0;
}
使用场景:用于是v要使用连续的常量,并且每个常量特殊含义的时候
三、Makefile
1. 什么是makefile
Makefile 是一个名为Makefile的工程管理文件
1. Makefile的文件名,可以是大写的Makefile也可以是小写的mkfile,一般使用大写的Makefile
2. 如果大写的Makefile 和 小写的Makefile同时存在,默认执行小写的Makefile
3. Makefile会工具文件的时间戳决定是否需要重新编译
2. 什么是Make
1. make是一个执行Makefile的工具
2. make格式:make 目标
3. make 的执行逻辑:会根据目标自动生成依赖树,通过依赖关系执行整个Makefile文件
3. Make用途
描述工程的执行过程,链接规则
完成自动化编译
4. Makefile的工作过程
一般程序编译分为4步,预处理>编译>汇编>链接
一步编译时,需要联合编译的文件,即使没有修改过也会被重新编译(效率低)
Makefile一般把文件编译过程分为2步执行
1. gcc -c 执行汇编操作,生成二进制文件,但是不链接
2. 从二进制文件链接到库文件,生成可执行文件
(1. Makefile分步编译的目的
1. 一步编译会导致源文件被大量重复编译
2. 只要不链接到库,就会重新生成可执行我加你,每次只重新编译更新过的文件
5. Makefile的语法规则
Makefile主要由规则构成
Makefile由规则,变量,函数和条件编译构成
Makefile中的注释:#规则由目标,依赖和指令构成
一条规则可以有多个目标,一个目标可以有多个依赖
一条规则必须有一个目标,
目标:依赖
指令 —>指令前面是一个tab键,不能使用4个空格代替
例:
all:../main.out #最后makfile的整体目标
clean:
rm *.o
#清空文件
../main.out:main.o server.o sqlite.o
gcc main.o server.o sqlite.o -lpthread -lsqlite3 -o ../main.out
#生成的最终文件保存至上一级目录
main.o: ../main.c
gcc -c ../main.c -lpthread -lsqlite3 -o main.o
#生成main.o文件
server.o: ../server.c
gcc -c ../server.c -lpthread -o server.o
#生成server.o文件
sqlite.o: ../sqlite.c
gcc -c ../sqlite.c -lsqlite3 -o sqlite.o
#sqlite.o文件
6. Makefile变量的赋值
(1. 递归赋值
=
递归赋值只取最后一次的结果
var1 = 1
var2=$(var1)
var1 = 2
test:
@echo $(var2)
输出:
(2. 追加赋值
+=
var1 = 1
var2+=$(var1) 3
test:
@echo $(var2)
输出
(3. 立即赋值
+=
var1 = 1
var2:=$(var1)
var1 = 2
test:
@echo $(var2)
输出
(4. 条件赋值
?=
当该变量未被定义十才能被赋值
var1 = 1
var2?=2
var1?=3
test:
@echo $(var1)![在这里插入图片描述](https://img-blog.csdnimg.cn/9546dc1db2974918a46914db4c384f0b.png)
@echo $(var2)
输出:
6. Makefile自动变量
对于命令而言
变量 | 功能 |
---|---|
$@ | 所有目标 |
$ ^ | 所有依赖 |
$ < | 第一个依赖 |
7. Makefile伪目标
.PHONY
功能:引入为目标可以解决当目标和文件名重复的问题
伪目标后面的要求:
伪目标后面的目标不管目标是文件还是指令,都执行该规则
.PHONY clean
8. Makefile通配符
%:模式匹配符
要求文件名必须同名
%.o:%.c
"自动匹配相同文件名的.c和.o文件"
8. Makefile内置函数
(1. wildcard
使用:$(wildcard 格式)
功能:模式匹配,从当前路径下找到指定格式的内容,找到后不同的内容间以空格作为分隔
$(wildcard *c) 匹配当前路径下所有的.c文件
(2. patsubst
使用:$(patsubst 格式1,格式2,要转换的文件)
功能:将