【Linux】gcc/g++/gdb的使用

【Qt】跨平台开发实战:QtCreator在Windows与Linux下的构建套件配置指南(gcc/g++/gdb/cmake) 本文详细介绍了QtCreator在Windows与Linux下的构建套件配置指南,涵盖gcc/g++/gdb/cmake等工具链的安装与设置。通过实战案例和分步教程,帮助开发者解决跨平台开发中的常见问题,确保编译环境一致性和高效调试。特别针对Windows和Linux的配置差异提供了专业解决方案。 阅读详情

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️小林爱敲代码
      🛰️社区 : 进步学堂
      🛰️欢迎关注:👍点赞🙌收藏✍️留言

💖gcc/g++的使用

gcc/g++的使用

gcc/g++是一个Linux编译器,gcc是用来编译c语言的,而g++是用来编译c++的,所以这2个编译器的使用方法是一样的。我们这里只讲解gcc,把一个C语言文件生成可执行程序要经历四个阶段
1. 预处理

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  • 预处理指令是以#号开头的代码行。 实例: gcc –E mytest.c –o mytest.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

以下是在Linux上的演示。首先我新建了一个 mytest.c的文件并编辑了一段代码。
在这里插入图片描述

现在我们执行命令 gcc -E mytest.c -o mytest.i

``在这里插入图片描述

我们会发现生成了一个mytest.i文件,然后我们用vim打开这个文件看看。
在这里插入图片描述

在这里插入图片描述

我们可以看到,之前打的注释没了,宏定义Num也替换了,并且头文件stdio.h在最上面展开。所以预处理功能主要包括宏定义,头文件展开,条件编译,去注释等。

2. 编译

  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
  • 例子: gcc –S mytest.i –o mytest.s

案例演示
我们还是用上面弄出来的mytest.i文件。 输入命令 gcc -S mytest.i -o mytest.s

在这里插入图片描述

然后就可以看到生成了一个mytest.s的文件,然后我们用vim打开它看看里面是什么内容。

在这里插入图片描述

我们可以看到,mytest.s文件里面都是汇编代码,这也就意味着 .s文件存的是C语言代码被转换成汇编时对应的汇编代码。

3.汇编

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  • 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
  • 实例: gcc –c hello.s –o hello.o

那么我们继续用上面的 mytest.s文件来演示。

我们输入 gcc -c mytest.s -o mytest.o

在这里插入图片描述

我们就可以看到生成了mytest.o文件,那我们也打开它看看它长什么样。

在这里插入图片描述

我们可以看到它全是一些乱码,这就意味着这个文件是一个二进制文件。也就是说汇编这个过程 是把汇编代码转换成二进制的机器码。

4.链接

  • 在成功编译之后,就进入了链接阶段。
  • 比如: gcc mytest.o –o mytest

然后我们发现我们有一个mytest的可执行文件。我们可以直接运行。

aa在这里插入图片描述

在这里插入图片描述

我们可以看到打印了10000,不过没有换行,所以挤在了一起。

当然,gcc mytest.c -o mytest 也是可以的。

静态库和动态库

静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。其后缀名一般为“.a”

动态库

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

gcc的一些操作选项

如下表所示:

选项说明
-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S编译到汇编语言不进行汇编和链接
-c编译到目标代码
-o文件输出到 文件
-static此选项对生成的文件采用静态链接
-g生成调试信息。GNU 调试器可利用该信息。
-shared此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w不生成任何警告信息。
-Wall生成所有警告信息。

💖gdb调试器的使用

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

gdb的安装及使用

而进入调试界面的方式是 gdb + 可执行程序名。

再此之前我们得有一个程序。下面是我们在test.c文件里面写的一个程序。

#include<stdio.h>

int TopSum(int max)
{
  int sum = 0;
  for(int i = 1; i <= max ; i++ )
  {
    sum += i;
  }
  return sum;
}


int main()
{
  int i = 100;
  int ret = TopSum(i);
  printf("%d\n",ret);

  return 0;
}
      
         

然后我们编译它,我们必须在编译的时候加上 -g选项,因为默认选项是release版本的。release版本是不支持调试的,只有加上 -g选项后才能让生成的可执行程序是debug版本。所以我们可以输入命令 gcc test.c -o test -g

在这里插入图片描述

而编译的时候提示报错,这是因为 for(int i …)在for循环里面定义变量只有在C99版本才能支持。所以我们把命令换成 gcc test.c -o test -g -std=c99 即可

在这里插入图片描述

这样就可以了,然后我们 gdb test即可进入调试界面。

如果出现这种信息,是因为你还没有安装gbd,那么可以用root用户去安装一下。

安装命令:yum install gdb

在这里插入图片描述

成功进入调试界面是这样的。

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

然后我们可以通过各种各样的指令来调试。

gdb的常用指令

那我们来演示几个最基本的命令

list/l 10 显示第10行的代码

在这里插入图片描述

run /r 运行程序

在这里插入图片描述

break/b 17 在第17行打上断点

在这里插入图片描述

info break/b 查看断点信息

在这里插入图片描述

n 单条执行

在这里插入图片描述

因为断点打在17行,所以17行执行完就到第18行了。

s/step 进入函数调用

在这里插入图片描述

进入到了函数的第一行,就是成功进入函数调用了。

delete breakpoints n 删除编号为n的断点

在删除之前,我们要先知道断点的编号。所以我们要先info b来查看断点信息。

在这里插入图片描述

Num这一列对应的就是断点编号,我们可以看到17行的断点编号为1,所以我们可以执行命令delete breakpoints 1来删除断点。

X

删除后我们再调用info b来查看断点信息,发现没有断点了,这就说明我们删除断点成功。

当然,gdb工具的使用命令还有很多,在下面已经为大家列好了一张命令操作表

选项说明
list/l 行号显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名列出某个函数的源代码。
r或run运行程序。
n 或 next单条执行。
s或step进入函数调用
break(b) 行号在某一行设置断点
break 函数名在某个函数开头设置断点
info break查看断点信息。
finish执行到当前函数返回,然后挺下来等待命令
print( p )打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量打印变量值。
set var修改变量的值
continue(或c)从当前位置开始连续而非单步执行程序
run(或r)从开始连续而非单步执行程序
delete breakpoints删除所有断点
delete breakpoints n删除序号为n的断点
disable breakpoints禁用断点
enable breakpoints启用断点
info(或i) breakpoints参看当前设置了哪些断点
display 变量名跟踪查看一个变量,每次停下来都显示它的值
undisplay取消对先前设置的那些变量的跟踪
until X行号跳至X行
breaktrace(或bt)查看各级函数调用及参数
info(i) locals查看当前栈帧局部变量的值
quit退出gdb

总结🥳:

💦💦如果有写的有什么不好的地方,希望大家指证出来,我会不断的改正自己的错误。💯💯如果感觉写的还可以,可以点赞三连一波哦~🍸🍸后续会持续为大家更新

🔥🔥你们的支持是我最大的动力,希望在往后的日子里,我们大家一起进步!!!
🔥🔥

IDEA+JRebel实现SpringBoot+MyBatis Plus项目热部署全攻略(含XML热更新实战) 本文详细介绍了如何在IDEA中使用JRebel为SpringBoot与MyBatis Plus项目配置高效的热部署方案。通过安装激活JRebel插件并配置关键扩展,重点解决了MyBatis XML映射文件修改后无法即时生效的痛点,实现了Java代码与XML文件的秒级热更新,从而彻底摆脱频繁重启应用的开发困境,大幅提升编码与调试效率。 阅读详情

相关推荐

使用 STM32F7 和 TensorFlow Lite 开发低功耗人脸识别设备

我们讨论了 STM32F7 的特点和能力,TensorFlow Lite 在 STM32F7 上的应用,以及一些降低功耗的优化技术。- 准备模型:选择合适的人脸识别模型,在 TensorFlow 中进行训练和导出,并使用 TensorFlow Lite 转换为适用于 STM32F7 的量化模型。请注意,上述代码仅展示了如何加载和运行 TensorFlow Lite 模型的方法,实际应用中需要集成人脸检测和识别模型,并根据实际需求进行相应的输入和输出处理。结合这两个工具,我们可以开发出低功耗的人脸识别设备。

weixin_66608063的博客 2586

“深入浅出”系列之Linux篇:(16)gcc/g++/gdb

gcc,全称 GNU Compiler Collection,是一款强大的开源编译器,支持多种语言(C、C++、Objective-C 等)。但今天,我们只专注它在C/C++ 编译领域的表现。把你写的代码从“人话”翻译成机器能看懂的“机器语言”。即:将你的程序代码编译成计算机能够识别的机器语言(01机器码)。预处理:处理宏定义、头文件、条件编译等。编译:将预处理的代码转成汇编代码。汇编:把汇编代码转成机器代码(生成目标文件)。链接:将目标文件生成可执行文件。开发阶段-O0或-O1,方便调试。生产环境。

weixin_65589140的博客 1107

别再到处找资源了!WinCC 7.5 SP2官方下载与Windows 10保姆级安装避坑指南

本文提供了WinCC 7.5 SP2在Windows 10上的官方下载与安装全流程指南,重点解决了资源获取难、系统兼容性问题及分卷压缩处理等常见痛点。通过详细的步骤和实用技巧,帮助用户顺利完成安装并优化配置,适用于工控领域的学习者和从业者。

weixin_32924297的博客 478

Linux的gcc编译过程(E、S、c、o、g)

Linux的gcc编译过程(E、S、c、o、g)

qq_53721052的博客 3512

基于Super-Jacoco的精准测试实践之路

灵魂拷问这个版本的影响范围到底有多大?研发改动了代码,为什么不通知测试?测试用例真的全面覆盖了吗?测试同学的测试覆盖情况该怎么评估?什么是精准测试概念借助技术手段、通过辅助算法对软件测试过...

咻咻ing的专栏 5841

Python自动化测试报告:飞书群机器人消息卡片实战

本文详细介绍了如何利用Python和飞书群机器人实现自动化测试报告的智能通知。通过构建可定制的消息卡片,将测试结果(如通过数、失败数)以清晰、美观的格式自动推送至团队群聊,并支持一键跳转查看详细报告,从而显著提升团队协作与问题响应效率。

k6l7m8n9的博客 811

gcc gdb 基础操作

本文操作均在 Linux 环境下完成 要了解 gcc 的使用先要了解源代码 (.c) 文件生成可执行文件的过程,分为两个环境: 具体参考:https://blog.youkuaiyun.com/m0_46606290/article/details/120604689 程序的翻译环境和运行环境: (1):程序的翻译环境: 预处理 编译 汇编 链接 (2):运行环境 这里 gcc 完成的是翻译环境 1.创建源文件 首先在当前目录下新建一个新目录并且切换到该目录下(mkcd),直接用 vim

TGRD4的博客 1702

内网穿透-frp二层隧道搭建

环境: weblogic: 192.168.0.133 10.10.20.12 win7 : 10.10.20.7 10.10.10.7go语言、跨平台的 可以分为frpc和frps frpc—>请求----->frps frps:放到黑客公网上 1.需要出网 2.配置: frpc:放到肉鸡上,请求frps 2.端口转发 2.1frpc传到肉鸡(weblogic) 利用工具,传入内存马到weblogic,然后使用冰蝎进行连接 然后在文件管理中上传frpc.exe和frpc.ini文件 fr

yyytaotao的博客 2103

GDB的安装和基本调试(安装步骤+基本调试命令和演示)

一、gdb安装 (一)首先检查系统中有没有安装过,有的话用以下命令卸载gdb旧版本 $ rpm -qa | grep gdb (二)卸载完后,安装(若下载的速度太慢,可参考我另一篇文章:修改ubuntu下载源) $ apt-get gdb 二、编译并生成可执行文件 例如现在需要调试book119.c的文件 (一)编译,并生成可执行文件 用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数 $ gcc-g-...

weixin_42158742的博客 1万+

详解vit_base_patch16_224

ViT-Base模型的核心思想是将输入图像划分为多个小块(patches),并使用Transformer架构来处理这些小块。具体来说,ViT-Base使用16x16像素的patch大小,输入图像的尺寸为224x224像素,这意味着每张图像将被划分为49个patch(22416×22416=14×14=19616224​×16224​=14×14=196个patch)。ViT-Base(ViT-B/16)通过将图像处理任务转化为序列处理任务。

具身机器人和通用AI 3227

Java的API帮助文档

JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。 JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。 JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。 官网下载: 1、登录Oracle官网(Oracl.

人生得意须尽欢 2万+

gdb调试工具使用

mkdir gdb vim test.c gcc test.c -o test -g gdb 文件名 进入gdb模式下命令: list ,简写l //一次显示10行 q //退出 run //运行 两种命令行参数模式 1、gdb test --args aaa bb 2、run aaa bb 设置断点 1、break 简写b 20 //在20行设断点 2、break add //在add函数...

weixin_43175816的博客 225

全网最详细教程,手把书教你使用YOLOv10训练自己的数据集和推理(附YOLOv10网络结构图)

YOLOv10,由清华大学多媒体智能组只开发,是一款亳秒级实时端到端目标检测的开源模型。该模型在保持性能不变的情况下,与YOLOv9相比,延迟减少了46%,参数减少了25%,非常适合需要快速检测物体的应用,如实时视频分析、自动驾驶和智能医疗等领域。这些改进使得YOLOv10在实时物体检测领域达到了新的技术水平。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

【Linux】GDB的安装与使用

GDB的安装与使用

kuangd_1992的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Linux详解】——gcc/g++/gdb/git的使用

📖 前言:本期将学习gcc/g++/gdb/git的使用。

HinsCoder的博客 926

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Linux】--make/makefile--gcc/g++/gdb

make,makefile,gcc,g++,gdb

weixin_52563203的博客 2039

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux下的基础开发工具vim/gcc/g++/gdb

文章目录前言vimgcc/g++初步了解gcc预处理编译汇编链接动态链接静态链接各自优缺点g++gcc/g++注意事项gdb 前言 学习Linux,少不了在Linux环境下做开发以及编写代码,就不得不得熟悉一下Linux下的这些基础开发工具了 在windows下像vs系列都是集编辑器、编译器、调试器等为一体的IDE环境,而linux下编辑、编译调试代码都需要不同的工具,下面来具体了解一下linux环境的基础开发工具。 vim vim是linux下多模式的编辑器,支持语法高亮、正则表达式、可视化操作

weixin_46016019的博客 1万+

Linux编译器-gcc/g++/gdb使用

关于Linux下gcc/g++/gdb的使用

s2501805787的博客 821

<Linux> 编译器与调试器—gcc/g++/gdb 的使用

gcc/g++使用还可以,gdb真的不好用

m0_64224788的博客 1209

linux工具gcc/g++/gdb/git的使用

c程序当中,如果要使用一个函数,不仅需要函数声明,还需要定义,但是我们所包含的头文件stdio.h当中,只有printf函数的声明,没有其定义,但是我们却可以完成调用?这是因为系统把c函数的定义都放到libc.so.6这个库当中了,gcc会到默认的/usr/lib路径下进行查找,找到函数定义,这也就是动态链接过程。函数库分为静态库和动态库,一般以.so结尾为动态库,.a结尾为静态库。静态链接是指编译链接时把库文件代码全部拷贝到该文件,生成的文件比较大。gcc默认生成的文件是动态链接的。查看git日志信息。

qq_64404343的博客 854

Linux篇:开发工具yum/vim/gcc/g++/Makefile/gdb

如果我们修改了原文件,历史上曾经还有可执行,那么原文件的最近修改时间,一定要比可执行程序要新!只需要比较,可执行程序的最近修改时间和源文件的最近修改时间:.exe新于.c源文件,不需要重新编译,.exe老于.c源文件,需要重新编译。定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作。」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 「n。」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直。

m0_74756975的博客 1682

【Linux】Linux 编译器与调试器 -- gcc/g++/gdb 的使用

Linux 编译器与调试器 -- gcc/g++/gdb 的使用:程序运行的四个阶段、动态链接与静态链接、动态库与静态库、gcc/g++ 的使用、debug 和 release 的区别、gdb 的使用

在平淡的日子里寻找存在的价值 1844

【Linux】基础开发工具(yum/gcc/g++/gdb/cgdb)

• 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库⽂件中去了,在没有特别指定 时,gcc 会到系统默认的搜索路径“/usr/lib”下进⾏查找,也就是链接到 libc.so.6 库函数中去,这样 就能实现函数“printf”了,⽽这也就是链接的作⽤。• 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该 函数的声明,⽽没有定义函数的实现,那么,是在哪⾥实“printf”函数的呢?常指的是文件最近⼀次被访问的时间。

2301_80319993的博客 1982

Linux下开发环境(gcc/g++/makefile/gdb)

Linux下开发环境(gcc/g++/makefile/gdb)

代码铺子 612

【Linux】Linux代码编译与调试工具 -- gcc/g++/gdb的使用

我们所以使用库中函数的代码(printf (.....)),其实我们只是使用了该函数的调用,没有对应实现,只有在链接的时候才和我们的代码关联起来。Linux 一般都会自动安装C语言动态库,因为Linux下的大多数指令以及我们默认使用 gcc 编译得到的可执行程序都是进行动态链接,依赖C动态库的;它的优点是形成的可执行程序小,缺点是受到动态库变动 (删除、升级等) 的影响。如上汇编过程形成的test.o文件存的是我们看不懂的二进制数字,我们可以使用od指令打开它(默认是以八进制打开)

睡不醒的猫的博客 1654

在Linux环境下安装gcc/g++/gdb/vim,以及进行vim的配置

在Linux中配置文件的位置 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root⽬目录下,通常已经存在一 个.vimrc文件。首先我们先执行ls -a命令查看以.开头的隐藏文件看是否有.vimrc文件 如果没有该文件 ,在当前用户的主工作目录下创建一

IT小书生的博客 1768
上一篇: 【Linux】vim的使用及常用快捷键(不会使用vim?有这篇文章就够了)
下一篇: 【Linux】git提交三把斧
林   子
博客等级 码龄4年 2671粉丝 64原创
评论 100
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林 子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值