常用工具(2)
目录
常用工具(2)
一、gdb调试工具
如果想进行调试 编译程序的时候
二、makefile 脚本编译工具
1、makefile是什么?
2、使用makefile
-- 安装make指令
-- make指令的使用
-- Makefile文件的书写规则:
-- Makefile的运行规则:
-- 补充:
一、gdb调试工具
-- 一般所有集成环境都会自带调试工具
- keil vscode qt 等都自带
-- gdb调试工具是linux系统自带的
如果想进行调试 编译程序的时候就:
-
gcc main.c -g
-- 需要添加选项-g -
使用方法:gdb 可执行程序名
-- 成功进入gdb调试工具
-- 调试的大概过程:1 添加断点 2 运行 3 调试
- 断点:当程序运行到断点后会自动停止 -- gdb的一些指令:
- l (L小写) 查看源文件内容 主要作用获取行号
-- l 行号
-- 一直输入l,就会一会向下显示程序,一个l不能完全显示程序。
-- 主要作用是为了让你知道在哪加断点
-- l 行号,可以直接跳转 - b 行号
-- 在该行上添加一个断点 - info b
-- 查看断点信息 - r -- 从头开始运行程序
-- 当程序遇到断点之后,不要在输入r了,如果输入r,就会重新从程序开头执行到该断点。
- c 继续运行直到遇到下一个断点停止
- s 遇到会进入到函数内部去运行
- n 遇到函数会直接将函数运行完毕
-- 注:s和n都是一步一步执行的。c是运行到下一个断点。
-- print 变量名
- 打印变量的值
-- clear 行号
- 清除该行断点
-- delete breakpoint 断点号
-
disable b 断点号
-- 失能断点 -
enable b 断点号
-- 使能断点
--q 退出
二、makefile 脚本编译工具
1、makefile是什么?
- makefile是一个文件,里面包含了一系列的指令,通过makefile可以方便的编译程序,makefile文件一般以makefile或者Makefile命名。
2、使用makefile
-- 安装make指令
- sudo apt-get install make
-- 如果出现错误,可以尝试一下命令:
- sudo apt-get update
-- make指令的使用
-- make指令执行后,会去当前所在的路径主动查找有没有叫 makefile 的文件去运行
- make 指令要想运行必须要有 Makefile 文件
-- 如果同一路径下有多个makefile文件 需要使用-f来指定运行哪一个,甚至文件名可以不是makefile
-- Makefile文件的书写规则:
-- 目标:依赖文件
(Tab)指令
- 语法规则
目标 ... : 依赖 ...
命令1 # 命令前一定要用tab
命令2
. . .
-- 注:在makefile文件中写注释的符号是#
-- 目标就是指要干什么,或说运行 make 后生成什么,
而依赖是告诉 make 如何去做以实现目标。 在 Makefile 中,
目标和依赖是通过规则来表达的。
-- 规则:
- 目标的时间必须晚于依赖条件的时间,否则,更新目标。
- 依赖条件如果不存在,找寻新的规则去产生依赖条件。
-- 变量的定义:
- 变量名 = 变量值
-- 变量的使用:
- $(变量名)
-- 特殊变量:
- $@ 表示目标文件
- $^ 表示所有的依赖文件
- $< 表示第一个依赖文件
-- makefile 中通配符
- % 百分号
- !!!必须是目标和依赖文件一块进行通配
-- Makefile的运行规则:
- 1、目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。
- 2、默认情况下Makefile的第一个目标为终极目标。
- 3、all:Makefile文件默认只生成第一个目标文件即完成编译,但是我们可以通过all 指定所需要生成的目标文件。
- 4、依赖:即目标文件由哪些文件生成。
- 5、命令:即通过执行命令由依赖文件生成目标文件。
-- 注意每条命令之前必须有一个tab(此文档编辑器默认是空格,复制下来的代码需要把命令代码的缩进改为tab制表符)保持缩进,这是语法要求(会有一些编辑工具默认tab为4个空格,会造成Makefile语法错误)。
- 运行规则
-- 补充:
-- 1、"="是最普通的等号,在Makefile中容易搞错赋值等号,使用 “=”进行赋值,变量的值是整个Makefile中最后被指定的值。
VIR_A = A
VIR_B = $(VIR_A) B
VIR_A = AA
经过上面的赋值后,最后VIR_B的值是AA B,而不是A B,在make时,会把整个Makefile展开,来决定变量的值
2、“:=” 表示直接赋值,赋予当前位置的值。
VIR_A := A
VIR_B := $(VIR_A) B
VIR_A := AA
最后BIR_B的值是A B,即根据当前位置进行赋值。因此相当于“=”,“:=”才是真正意义上的直接赋值
3、“?=” 表示如果该变量没有被赋值,赋值予等号后面的值。
- VIR ?= new_value
如果VIR在之前没有被赋值,那么VIR的值就为new_value。
- VIR := old_value
- VIR ?= new_value