linux工具学习 day03(gdb、makefile学习)
1、gdb命令
- run:在调试器中运行程序
- list:查看程序源码
- break+行号:设置断点
- break+行号+if条件:设置断点
- break+函数名:设置断点
- info break:查看断点信息
- delete+断点编号:删除断点
- enable/disable:使能断点
- print+X+变量名:查看变量值
- next:单步执行,不进入子函数(跳过函数,直接拿结果)
- step:单步执行,进入子函数
- continue:继续执行,遇到下个断点
- finish:继续执行,在函数内部时,执行到函数结束
- call+函数名:调用函数
- print+变量=值,设置变量里面的值
- clear:清除所有断点
- ptype+变量:查看变量类型
- gdb+可执行文件+--tui:启动图形化调试窗口
- layout asm:显示汇编
- layout src:显示源码
- layout spilt:显示源代码+汇编
2、工程管理器make(如何编写makefile文件)
- 什么是工程? 多个源文件+其他文件(图片+头文件+脚本)
- 工程管理器的作用:自动编译多个源文件
- make的依赖makefile(大小写都可以,会先用小写,可以-f 指定目标文件)
- makefile文件是一种脚本文件
- makefile语法:
- 目标(最终生成的文件):真目标(会生成目标文件)伪目标(用 . PHONY 声明不会生成目标文件)
- 依赖(生成目标时所需要的文件)、命令(生成目标时,需要执行的命令)
- 执行顺序
- make:默认从第一个目标体执行
- make+目标体:从对应的目标体执行
- 如果目标体后面依赖的文件是一个目标的话,先执行依赖对应的目标,在执行目标体的命题
- 自动化变量($^ 所有依赖文件 $@目标文件 $< 第一个依赖文件) gcc $^ -o $@ 还可以用@取消回显,可以用@echo make done 进行回显
- 多级目录下的makefile(衣橱分开装衣服,方便拿取,方便更新)
- 顶层:总控:进入各个子功能目录下执行make命令,将各个子目录下的.o文件链接生成可执行文件
- 子目录:功能:将当前目录下的.c文件编译成.o文件
- scripts目录:头文件:定义一些变量
- 观看顺序,3,1,2。
- 举例工程里makefile分析
scripts下的makefile
CC := gcc//:=是只有被定义过的变量才会赋值,没有被定义的变量自动忽略。 cc就是gccc CFLAGS := -Wall -O3 //环境变量 警告 #链接库,线程库 Libs = -lpthread #target是一个目标变量,值为demo Target := demo #显示出src目录下所有会后缀名为.c的文件赋值给source Source := $(wildcard src/*.c)//$(函数名 变量,变量)makefile里面函数的形式 #Objs等于把source中所有的.c后缀名都换成.o Objs := $(patsubst %.c,%.o,$(Source)) #目前理解,就是有所有子目录(功能)的makefile文件夹,都给他 Modules += add main #为modules中的每个单词加上后缀名.o AllObjs := $(addsuffix /src/*.o,$(Modules))
总控里的makefileinclude scripts/Makefile #cd $(1) && $(make) 相当于下面等式,意思是读取各个目录中的子功能makefile #$(变量名) 这种形式都是变量 modules_make = $(MAKE) -C $(1); modules_clean = $(MAKE) clean -C $(1); #定义了四个伪目标 .PHONY: all mm mc clean all: $(Target) 默认没有操作命令是自动寻找.c的文件然后编译成.o的文件 #call函数 循环把参数依次赋给变量参数中的$(1)$(2),返回赋值后的变量值。 #循环,把modules里面每一个拿出来给n,然后完成-c操作,编程o。 mm: @ $(foreach n,$(Modules),$(call modules_make,$(n))) mc: @ $(foreach n,$(Modules),$(call modules_clean,$(n))) $(Target) : mm #就是 gcc -wall03 -o 可运行程序名 所有可执行的.o文件 链接库 gcc 警告 命名为demo,连接库 $(CC) $(CFLAGS) -o $(Target) $(AllObjs) $(Libs) #输出可执行程序名 make done。 @ echo $(Target) make done! clean : mc #删除可执行程序 rm -rf $(Target) #基本显示@echo @ echo clean done!
子目录下的makefile
include ../scripts/Makefile #疑问,依赖后面为啥没有写命令 all : $(Objs) //应该只是省略了gcc obj.o
//(理解错误)自动查找objs下的.c文件自动编译成.o的目标文件 clean : rm -rf $(Objs) - makefile变量
- $(变量名) obj=a.o b.o test:$(obj)
- = :前面的变量可以通过后面的变量定义
- := :前面的变量不可以由后面的变量定义
- +=:类似于C语言,给变量追加值
- ?=:变量值被定义过复合无效,没被定义过相当于等于
- override(var=value)指示符:有些变量是命令行参数设置的,makefile中对这个变量的赋值会hulue,如果需要设置这类参数的数值,可以使用override指示符。
- define endef:多行变量
- CFLAGS:环境变量,设置之后,可以在所有的makefile中使用这个变量
- 目标变量:target:var ,当我们设置这个变量,变量会作用到由这个目标所引发的所有规则中去。
- 模式变量:可以给定一种模式,把变量定义在复合这种模式的所有目标上
- 变量的高级用法:$(var:a=b)把var中所有以a字串结尾的a替换成b字串,另一种是静态模式。第二种把变量的值在变成变量。
- 文件查找
- VPATH(变量):make工程各行管理器在当前目录下找不到源文件时,就会自动到VPATH指定的目录中寻找 (vpath=目录1:目录2)
- vpath(关键字):(vpath 模式 目录:目录)
- 条件判断
- ifeq(参数1,参数2):比较1和2的值是否相等,相同为真,相异为假
- ifneq(参数1,参数2):比较1和2的值是否相等,相同为假,相异为真
- ifdef(参数):参数非空为真,空为假
- ifndef(参数):参数空为真,非空为假
- makefile部分函数
- 函数名格式: $(函数名 参数,参数)
- $(subset from,to,text):字符串替代函数
- $(patsubset pattern,replacement text):模式字符串替换函数
- $(wildcard):列出当前目录下所有复合模式参数的文件名。
- $(strip string):去掉字符串开头结尾的空字符
- $(findstring find in):查找字符串,返回值是所查找的字符串或者是空字符串
- $(filter pattern text):以pattern的模式过滤text字符串的单词,保留复合pattern的单词
- $(filter-out pattern text):反过滤函数,去除复合pattern的单词
- sort(list):升序,返回排序后的字符串,并且去除相同的单词
- word(n text):取单词函数
- wordlist(s,e, text):取单词串函数,从第s取到第e
- words(text):统计单词个数
- firstword(text):取首单词
- dir(names):返回目录部分
- notdir(names):返回不是不是目录的部分
- suffix(names):取后缀名
- basename(names):取前缀
- $(addsuffix ):加后缀
- $(addprefix):加前缀
- join(list1,list2):连接函数,2加到1后面,如果1比2多,1保持原样,如果2比1多,多出来的单词被复制到2中,
- $(foreach var, list,text):循环函数,把list中的单词逐一放到var所指定的变量中,在执行text所包含的表达式,每一次text都会返回字符串,最后结束,text返回的字符串以空格分隔组成字符串给foreach,var作用域只在foreach函数中。
- $(call expression, parm1,parm2):唯一一个用来创建新的参数化的函数, reverse = $(1) $(2) foo = $(call reverse,a,b) foo的值为a,b reverse=$(2)$(1) foo=$(call reverse,a,b)这个时候foo的值为b,a
- $(if condition, thenpart,可有可无elsepart):函数,condition为真,thenpart会被计算,否则elsepart会被计算,thenpart和elsepart只会有一个被计算
- $(error text):产生一个致命的错误
- $(warning):并不会让make退出,知识输出一段警告的信息,而make继续执行。
- origin(variable):并不操作变量值,而是表名变量是从来的,var是变量的名字,而不是引用,所以尽量不要再这里使用$字符,origin会以返回值来告诉变量是从哪里来的,关于origin函数的返回值。
- undefined:没有被定义过
- default:默认的定义
- file:被定义在Makefile中
- command line:是被命令行定义的
- override:是被override指示符重新定义的
- automatic:在命令运行中的自动化变量。
- make退出码 0 成功执行;1 make运行时出现任何错误;2 使用make -q选项,并且make使得一些目标不需要更新,返回2.
- 指定目标
- all:编译所有目标
- clean:删除所有被make创建的文件
- install:安装已编译好的程序,其实就是把目标文件拷贝到指定的目标中去
- print:列出改变过的源文件
- tar:把源程序打包备份
- dist:创建一个压缩文件,一般把tar文件压缩成z、gz文件
- TAGS:更新所有的目标
- check test:测试makefile的流程

浙公网安备 33010602011771号