当前位置: 首页 > news >正文

【Linux系统】开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}

【Linux系统】开发工具(上) {软件包管理器yum,更新yum源,文本编辑器vim,vim的三种基本模式,vim指令集,代码编译器gcc/g++}


四、Linux调试器:gdb

4.1 debug模式

  • 程序的编译模式有两种,debug模式和release模式
    • debug模式:加入了调试信息,使程序可已被调试。但体量较大,运行较慢。
    • release模式:可执行程序中没有调试信息,不可被调试。但程序体量小;且编译器对程序做相关优化,运行速度快。
  • Linux gcc/g++编译出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

4.2 如何使用?

  1. debug模式编译

    • gcc -g test.c -o test.out
      
  2. 进入gdb模式

    • gdb test.out
      
  3. 基本操作

    1. 运行程序:r或run
    2. 逐过程:n或next
    3. 逐语句:s或step
    4. 执行完成当前函数:finish
    5. 执行到下一个断点处:c或continue
    6. 执行到指定行:until 行号
  4. 显示源代码:l或list

    1. 显示指定行的源代码(每次10行):l/list 行号
    2. 从上次的位置开始显示:l/list
    3. 显示指定函数的源代码:l/list 函数名
  5. 断点相关

    1. 设置断点

      1. 在指定行设置断点:b/break 行号

      2. 在指定函数的入口处设置断点:b/break 函数名

    2. 查看断点信息: i b/info b

    3. 删除断点:d 断点号

    4. 删除所有断点:delete breakpoints

    5. 禁用断点:disable 断点号

    6. 启用断点:enable 断点号

  6. 监视器

    1. 临时显示变量或表达式的值:p/print 表达式
    2. 监视变量或表达式的值:display 表达式
    3. 取消监视变量或表达式的值:undisplay 表达式编号
    4. 显示当前栈帧局部变量的值:i/info locals
    5. 调试时修改变量的值:set var 变量=#
  7. 调用堆栈

    1. 查看各级函数调用及参数:bt/breaktrace
  8. 退出gdb:quit 或 ctrl + d


五、Linux项目自动化构建工具:make/Makefile

5.1 什么是make/Makefile?

  • make/Makefile用于维护文件和文件之间的相互依赖关系,由多文件形成可执行程序。简单来说,make/Makefile用于进行多文件编译

  • makefile文件

    • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
    • makefile是一个文件,记录了文件间的依赖关系和依赖方法。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make命令

    • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
    • make是一条命令,makefile是一个文件,两个搭配使用,完成项目的自动化构建。

5.2 如何写Makefile文件?

1. 规则模板

img

2. 写明依赖关系和依赖方法

  • 一般写法
    在这里插入图片描述

    • 依赖关系:上图中可执行程序mycode的生成依赖于mycode.c源文件

    • 依赖方法:gcc -o mycode mycode.c就是对应的依赖关系

    注意:写依赖方法前要加Tab进行缩进

  • 特殊符号简写
    在这里插入图片描述

    • $@:表示目标文件(图中的mycode文件)
    • $^:表示所依赖的文件列表(图中的mycode.c文件)

3. 写明项目清理方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5xYX3NyS-1680169559237)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230328115148743.png)]

  • 有时工程是需要被清理的,以便重新编译。
  • make扫描Makefile文件的时候,默认会形成一个目标依赖关系,一般是第一个!在执行make空命令时,会自动执行目标依赖关系。
  • 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显式的要求make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重新编译。
  • .PHONY:用于修饰对应的符号,表示伪目标。被修饰的符号总是可以被执行。

5.3 多文件编译

  • 多文件编译的框架:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hr1RRsfg-1680169559242)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330152410704.png)]

  • 编写src目录下的makefile文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eylKrS0-1680169559243)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230329204336079.png)]

    生成目标文件:将各源文件编译成目标文件,并将生成的目标文件移动到obj目录下。

  • 编写obj目录下的makefile文件

    img

    生成可执行程序:将所有目标文件与库文件进行链接,形成可执行程序。并将生成的可执行程序移动到bin目录下

  • 编写项目主目录下的Makefile文件

    img

    总控:全局:先后到src和obj目录下生成目标文件和可执行程序。还可以进行项目清理,以便重新生成。

  • 为什么要分两步编译?

    • 程序编译一般分两步:.c->.o,.o->.out

    • 分两步两步编译是因为:如果其中某个源文件存在问题,调试修改后只需要将这个存在问题的源文件重新编译成目标文件即可。其他h的目标文件直接链接,不用再次编译

    • 如果一步直接.c->.out其中的.o文件没有保存,则若每次修改其中某个.c文件都需要把所有文件都重新编译一次浪费时间。


六、Linux小程序:进度条

6.1 行缓冲区

#include <stdio.h>
int main()
{
printf("hello Makefile!");
sleep(3);
return 0;
}
  • printf已经执行,但是数据没有被立即刷新到显示器上。

  • 显示器设备的刷新策略是行刷新,即遇到\n进行刷新。

  • 使用printf输出的字符串只有遇到换行符\n才会刷新到显示器。在此之前字符串会被暂存在此C程序的行缓冲区中。

  • 当然,我们也可以使用fflush函数将缓冲区中的数据立即刷新到标准输出(显示器)。

6.2 进度条代码

#include <stdio.h>                           
#include <unistd.h>                      
#include <string.h>                      int main(){                              char bar[101];                         char *label="|/-\\";                   memset(bar,0,sizeof(bar));             for(int i = 0; i <= 100; i++)          {                                      printf("[%c][%-100s][%-3d%%]\r",label[i%4],bar,i);    fflush(stdout);                      bar[i]='#';                          usleep(50000);                       }                                      printf("\n");                          return 0;                              
} 

七、代码管理平台:git

  • 常用命令

    1. git clone:将gitee云中的仓库拷贝到本地

    2. git status:查看当前仓库的状态包括:待添加的文件,待提交的文件等

    3. git log:显示当前仓库的提交记录和日志信息

    4. git add:添加文件到待提交文件列表

    5. git reset HEAD:取消设置待提交文件

    6. git commit:将待提交文件提交到本地仓库

      • git commit -m “日志信息” //提交必须填写日志信息
      • git commit -m -a “日志信息” //未添加文件而只是删除文件
    7. git push:将本地仓库中的内容上传到gitee云

http://www.lryc.cn/news/44290.html

相关文章:

  • 线性代数——行列式
  • Spring注解-Spring-boot-SpingAOP
  • 使用Shell传参解决DataPhin中PySpark不支持中文的问题
  • 【CDH】cloudera manger 如何开启Debug 日志调试模式
  • SQL Server 用户授权与回收
  • 电脑出现乱码的原因以及解决方法
  • 网络工程师笔记
  • linux用户添加用户组与目录切换用户组的操作记录
  • 在CentOS 7上使用二进制文件安装单节点Kubernetes的详细步骤:
  • iCollections for mac 8.0.6.80608 保持Mac桌面的整洁
  • 学习HM微博项目第8天
  • 十五、存储过程与函数
  • php实现助记词转TRX,ETH 私钥和钱包地址
  • 浅析可观测系统中sdk的不同引入方式的利与弊
  • Google Earth导入经纬高(txt文件)
  • Unity客户端开发工程师的进阶之路
  • 2023年全国最新高校辅导员精选真题及答案34
  • chatGPT身份指令
  • 基于springboot实现私人健身与教练预约管理系统【源码+论文】分享
  • 网络技术领域术语大全,含中英文及缩写,强烈建议收藏!
  • C++源码剖析——vector和array
  • 学习linux编程(一)
  • pt-query-digest_详细使用方法
  • 基于MATLAB编程的萤火虫FA优化BP神经网络的回归分析
  • leetcode 消失的数字(面试题)
  • Spring入门篇6 --- AOP
  • linux 配置java环境
  • 分布式事务基础入门
  • 白盒测试究竟怎么做
  • EEG微状态的功能意义