linux工具学习 day03(gdb、makefile学习)

1、gdb命令

  1. run:在调试器中运行程序
  2. list:查看程序源码
  3. break+行号:设置断点
  4. break+行号+if条件:设置断点
  5. break+函数名:设置断点
  6. info break:查看断点信息
  7. delete+断点编号:删除断点
  8. enable/disable:使能断点
  9. print+X+变量名:查看变量值
  10. next:单步执行,不进入子函数(跳过函数,直接拿结果)
  11. step:单步执行,进入子函数
  12. continue:继续执行,遇到下个断点
  13. finish:继续执行,在函数内部时,执行到函数结束
  14. call+函数名:调用函数
  15. print+变量=值,设置变量里面的值
  16. clear:清除所有断点
  17. ptype+变量:查看变量类型
  18. gdb+可执行文件+--tui:启动图形化调试窗口
  19. layout asm:显示汇编
  20. layout src:显示源码
  21. layout spilt:显示源代码+汇编

2、工程管理器make(如何编写makefile文件)

  1. 什么是工程? 多个源文件+其他文件(图片+头文件+脚本)
  2. 工程管理器的作用:自动编译多个源文件
  3. make的依赖makefile(大小写都可以,会先用小写,可以-f 指定目标文件)
  4. makefile文件是一种脚本文件
  5. makefile语法:
    1.       目标(最终生成的文件):真目标(会生成目标文件)伪目标(用   . PHONY 声明不会生成目标文件)
    2.   依赖(生成目标时所需要的文件)、命令(生成目标时,需要执行的命令)
  6. 执行顺序
    1.   make:默认从第一个目标体执行
    2.         make+目标体:从对应的目标体执行
    3.        如果目标体后面依赖的文件是一个目标的话,先执行依赖对应的目标,在执行目标体的命题
  7. 自动化变量($^ 所有依赖文件    $@目标文件  $< 第一个依赖文件) gcc $^ -o $@ 还可以用@取消回显,可以用@echo make done 进行回显
  8. 多级目录下的makefile(衣橱分开装衣服,方便拿取,方便更新)
    1.    顶层:总控:进入各个子功能目录下执行make命令,将各个子目录下的.o文件链接生成可执行文件
    2.         子目录:功能:将当前目录下的.c文件编译成.o文件
    3.         scripts目录:头文件:定义一些变量
    4. 观看顺序,3,1,2。
  9. 举例工程里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))


    总控里的makefile
    include 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)
  10. makefile变量
    1.  $(变量名) obj=a.o b.o    test:$(obj)
    2.  = :前面的变量可以通过后面的变量定义
    3. := :前面的变量不可以由后面的变量定义
    4. +=:类似于C语言,给变量追加值
    5. ?=:变量值被定义过复合无效,没被定义过相当于等于
    6. override(var=value)指示符:有些变量是命令行参数设置的,makefile中对这个变量的赋值会hulue,如果需要设置这类参数的数值,可以使用override指示符。
    7. define    endef:多行变量
    8. CFLAGS:环境变量,设置之后,可以在所有的makefile中使用这个变量
    9. 目标变量:target:var ,当我们设置这个变量,变量会作用到由这个目标所引发的所有规则中去。
    10. 模式变量:可以给定一种模式,把变量定义在复合这种模式的所有目标上
    11. 变量的高级用法:$(var:a=b)把var中所有以a字串结尾的a替换成b字串,另一种是静态模式。第二种把变量的值在变成变量。
  11. 文件查找
    1. VPATH(变量):make工程各行管理器在当前目录下找不到源文件时,就会自动到VPATH指定的目录中寻找 (vpath=目录1:目录2)
    2. vpath(关键字):(vpath 模式 目录:目录)
  12. 条件判断
    1. ifeq(参数1,参数2):比较1和2的值是否相等,相同为真,相异为假
    2. ifneq(参数1,参数2):比较1和2的值是否相等,相同为假,相异为真
    3. ifdef(参数):参数非空为真,空为假
    4. ifndef(参数):参数空为真,非空为假
  13. makefile部分函数
    1.  函数名格式: $(函数名 参数,参数)
    2. $(subset from,to,text):字符串替代函数
    3. $(patsubset  pattern,replacement text):模式字符串替换函数
    4. $(wildcard):列出当前目录下所有复合模式参数的文件名。
    5. $(strip string):去掉字符串开头结尾的空字符
    6. $(findstring  find in):查找字符串,返回值是所查找的字符串或者是空字符串
    7. $(filter pattern text):以pattern的模式过滤text字符串的单词,保留复合pattern的单词
    8. $(filter-out pattern text):反过滤函数,去除复合pattern的单词
    9. sort(list):升序,返回排序后的字符串,并且去除相同的单词
    10. word(n text):取单词函数
    11. wordlist(s,e, text):取单词串函数,从第s取到第e
    12. words(text):统计单词个数
    13. firstword(text):取首单词
    14. dir(names):返回目录部分
    15. notdir(names):返回不是不是目录的部分
    16. suffix(names):取后缀名
    17. basename(names):取前缀
    18. $(addsuffix ):加后缀
    19. $(addprefix):加前缀
    20. join(list1,list2):连接函数,2加到1后面,如果1比2多,1保持原样,如果2比1多,多出来的单词被复制到2中,
    21. $(foreach var, list,text):循环函数,把list中的单词逐一放到var所指定的变量中,在执行text所包含的表达式,每一次text都会返回字符串,最后结束,text返回的字符串以空格分隔组成字符串给foreach,var作用域只在foreach函数中。
    22. $(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
    23. $(if condition, thenpart,可有可无elsepart):函数,condition为真,thenpart会被计算,否则elsepart会被计算,thenpart和elsepart只会有一个被计算
    24. $(error text):产生一个致命的错误
    25. $(warning):并不会让make退出,知识输出一段警告的信息,而make继续执行。
    26. origin(variable):并不操作变量值,而是表名变量是从来的,var是变量的名字,而不是引用,所以尽量不要再这里使用$字符,origin会以返回值来告诉变量是从哪里来的,关于origin函数的返回值。
      1. undefined:没有被定义过
      2. default:默认的定义
      3. file:被定义在Makefile中
      4. command line:是被命令行定义的
      5. override:是被override指示符重新定义的
      6. automatic:在命令运行中的自动化变量。
  14. make退出码 0 成功执行;1 make运行时出现任何错误;2 使用make -q选项,并且make使得一些目标不需要更新,返回2.
  15. 指定目标
    1.  all:编译所有目标
    2. clean:删除所有被make创建的文件
    3. install:安装已编译好的程序,其实就是把目标文件拷贝到指定的目标中去
    4. print:列出改变过的源文件
    5. tar:把源程序打包备份
    6. dist:创建一个压缩文件,一般把tar文件压缩成z、gz文件
    7. TAGS:更新所有的目标
    8. check test:测试makefile的流程
posted @ 2023-05-15 20:24  风中凌乱的猪头  阅读(48)  评论(0)    收藏  举报