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

初识Linux:Linux开发工具gcc/g++和gdb以及Makefile的使用

目录

​编辑

1.gcc/g++的用处(作用)

2.gcc/g++的语法使用

3.gdb的用处(作用)

4.gdb的命令大汇总(包含大部分常用命令)

5.make/Makefile


1.gcc/g++的用处(作用)

gcc/g++是GNU开发的C/C++编译器,编译过程通常包含以下四个步骤:

(1)预处理

预处理阶段处理源代码中的宏定义、头文件包含、条件编译等指令。预处理器(cpp)将#include的文件内容插入到源文件中,替换#define定义的宏,并处理#ifdef等条件编译指令。生成.i(C)或.ii(C++)文件。

(2)编译

编译阶段将预处理后的代码转换为汇编代码。编译器(gcc/g++)进行词法分析、语法分析、语义分析及优化,生成与平台相关的汇编语言文件(.s)。

eg:

movl $1, %eax

(3)汇编

汇编器(as)将汇编代码转换为机器指令(二进制目标文件.o.obj)。此阶段逐行翻译汇编指令为可被CPU直接执行的机器码,生成目标文件。

(4)链接

链接器(ld)将多个目标文件及库文件合并为最终的可执行文件(如a.out)。解决符号引用(如函数调用),合并代码段和数据段,并处理静态库(.a)或动态库(.so/.dll)的依赖关系。

以上步骤代码执行的显示如下图:

gcc -E source.c -o output.i  # 预处理  
gcc -S output.i -o output.s  # 编译  
gcc -c output.s -o output.o  # 汇编  
gcc output.o -o program      # 链接  

2.gcc/g++的语法使用

  • -E:仅执行预处理
  • -s:只进行预处理和编译
  • -c:指示编译器只进行编译而不进行链接。
  • 注意事项:目标文件需通过后续链接步骤生成可执行文件。若省略 -c 且未指定 -o,GCC 会尝试生成名为 a.out 的可执行文件。
  • -o:用于指定输出文件的名称
  • -g:生成调试信息
  • -static:生成的文件采用静态链接。
  • 注意:gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件。

3.gdb的用处(作用)

gdb是一款功能强大的程序调试工具!!!!

gdb的主要功能包括:

  1. 程序调试:支持设置断点、单步执行、变量监控等调试操作
  2. 错误诊断:帮助定位程序崩溃、内存泄漏等问题的根源
  3. 代码审查:可以查看程序执行过程中的函数调用栈和变量状态
  4. 性能分析:通过调试信息分析程序运行时的性能瓶颈
  5. 逆向工程:可用于分析二进制程序的执行流程
  6. 多线程调试:支持调试多线程应用程序
  7. 跨平台支持:可在多种操作系统和硬件架构上使用

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。

4.gdb的命令大汇总(包含大部分常用命令)

运行程序:

run/r [args]          # 运行程序(可带参数)
start                 # 运行到main函数暂停
continue/c            # 继续运行程序
next/n                # 单步执行(跳过函数调用)
step/s                # 单步执行(进入函数调用)
until [location]      # 运行到指定位置
finish                # 执行完当前函数并暂停

断点管理:

break/b [location]    # 设置断点(函数名/行号/地址)
tbreak                # 设置临时断点
watch [expr]          # 监视表达式变化
catch [event]         # 捕获特定事件(如throw)
info breakpoints      # 查看所有断点
delete [num]          # 删除断点
disable/enable [num]  # 禁用/启用断点

显示操作:

list/l                # 显示源代码
list [function]       # 显示特定函数源码
list [file]:[line]    # 显示特定文件行数
directory [path]      # 添加源代码搜索路径
print/p [expr]        # 打印表达式值
print/x               # 十六进制格式打印
print/d               # 十进制格式打印
print/t               # 二进制格式打印
display [expr]        # 每次停止时自动显示
undisplay [num]       # 取消自动显示

退出与启动gdb:

gdb [executable]      # 启动GDB并加载可执行文件
gdb -p [pid]          # 附加到正在运行的进程
quit/q                # 退出GDB

5.make/Makefile

(1)了解make/Makefile

• 会不会写makefile,从⼀个侧面说明了⼀个⼈是否具备完成大型工程的能力。

• ⼀个⼯程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了⼀ 系列的规则来指定,哪些⽂件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚中至 于进行更复杂的功能操作

• makefile带来的好处就是⸺“自动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全自动编译,极大的提⾼了软件开发的效率。

• make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,大多数的IDE都有这 个命令,比如:Delphi的make,VisualC++的nmake,Linux下GNU的make。可见,makefile 都成为了⼀种在⼯程方面的编译方法。

• make是⼀条命令,makefile是⼀个文件,两个搭配使用,完成项目自动化构建。

(2)使用make和Makefile

上图的依赖关系:

上面的文件myproc,它依赖myproc.c

依赖方法:

那么当仅输入make命令时,其默认工作方式如下:

1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。

2. 如果找到,它会找文件中的第⼀个目标文件(target),在上面的例子中,他会找到个文件,并把这个文件作为最终的目标文件。

3. 如果 myproc 文件不存在,或是比my myproc 所依赖的后面的 proc 这个文件新(可用 myproc 这 myproc.o 文件的文件修改时间要 touch 测试),那么,他就会执行后⾯所定义的命令来生成 myproc 这个文件。

4. 如果 myproc 所依赖的 myproc.o 文件不存在,那么 make 会在当前⽂件中找目标为 myproc.o 文明件的依赖性,如果找到则再根据那⼀个规则生成 myproc.o 文件。(这有点像⼀ 个堆栈的过程)

5. 当然,你的C文明件和H文件是存在的啦,于是 myproc.o 文件声明 make 会生成 myproc.o 文件,然后再用 make 的终极任务,也就是执行文件 hello 了。

6. 这就是整个make的依赖性,make会⼀层又一层地去找文件的依赖关系,直到最终编译出第⼀个 目标⽂件。

7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并 报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对 不起,我就不工作啦。

项目是需要被清理的:

• ⼯程是需要被清理的

• 像clean这种,没有被第⼀个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动 执行,不过,我们可以显示要make执行。即命令⸺“makeclean”,以此来清除所有的目标文件,以便重编译。

• 但是⼀般我们这种clean的目标文件,我们将它设置为伪目标,用.PHONY 修饰,伪目标的特性是,总是被执行的。

注意:

$@: 代表⽬标文件名。

$^: 代表依赖文件列表

$(RM): 替换,用变量内容替换它

eg:

好了初步linux的内容已经结束啦,谢谢你的观看!!!!!觉得好的话点赞加收藏哦!

http://www.xdnf.cn/news/1082089.html

相关文章:

  • App爬虫工具篇-appium配置
  • 【STM32实践篇】:GPIO 详解
  • 2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--上篇
  • 九、K8s污点和容忍
  • web前端面试-- MVC、MVP、MVVM 架构模式对比
  • 递归与循环
  • 高频交易服务器篇
  • A/B测试实战:页面微小改动如何带来30%转化率提升?
  • ABC413 : E Reverse 2^i
  • Vue前端项目接收webSocket信息
  • Linux网络配置与故障排除完全指南
  • 介绍electron
  • 【ES6】Latex总结笔记生成器(网页版)
  • TailWind CSS Intellisense 插件在VSCode 上不生效
  • LESS/SCSS 高效主题换肤方案
  • 基于 LangChain 实现通义千问 + Tavily 搜索 Agent 的简单实践
  • 在VMware虚拟机中安装Windows 98时,Explorer提示“该程序执行了非法操作,即将关闭”的解决办法
  • 虚拟机与容器技术详解:VM、LXC、LXD与Docker
  • php协程
  • MySQL 数据库传统方式部署主从架构的实现很详细
  • React Native 亲切的组件们(函数式组件/class组件)和陌生的样式
  • 若 VSCode 添加到文件夹内右键菜单中显示(通过reg文件方式)
  • 盘式制动器的设计+说明书和CAD)【6张】+绛重
  • Redis性能优化
  • 权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记
  • 前端捕获异常的全面场景及方法
  • Linux操作系统之文件(三):缓冲区
  • 每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
  • 【每天一个知识点】动态知识库
  • JxBrowser 8.9.0 版本发布啦!