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

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

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.gcc/g++语法

2.gcc的使用及编译器是如何"翻译"代码的?

(1)预处理

(2)编译

(3)汇编

(4)链接

3.动静态库

4.gdb的使用


前言

本篇文章博主将会讲解gcc/g++的使用并搭配编译器相关知识讲解代码翻译的过程,一些常见的gcc/g++语法也会总结出来,在Linux下想要调试代码我们需要借助GUN调试器(gdb),那如何使用gdb博主也会进行讲解。


欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


1.gcc/g++语法

gcc [选项] 要编译的文件 [选项] [目标文件]

🐸常用选项速览🐸


  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面(否则就会打印到屏幕上)。
  • -S 编译到汇编语言不进行汇编和链接。
  • -c 编译到目标代码。
  • -o 将处理结果输出到指定文件,后接文件名。
  • -static 此选项对生成的文件采用静态链接。
  • -g 生成调试信息。GNU 调试器(即gdb调试器)可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小。
  • -w 不生成任何警告信息。
  • -Wall 生成所有警告信息。
  • -O0/-O1/-O2/-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

2.gcc的使用及编译器是如何"翻译"代码的?

(1)预处理

预处理功能主要包括宏替换、头文件展开、条件编译、去注释等,预处理指令是以#号开头的代码行。

实例: gcc –E test.c –o test.i

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

条件编译多提一嘴:

我们可以通过给编译器传递不同的宏值,来进行对代码的动态裁剪。

实例:gcc test.c -o test -D VERSION1=1


(2)编译

编译阶段,gcc/g++首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,将代码翻译成汇编语言。

实例:gcc -S test.i -o test.s

用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

-o选项是指目标文件,“xxx.s”文件为已经过翻译的原始程序。


(3)汇编

汇编阶段是把编译阶段生成的“xxx.s”文件转成目标文件。

实例:gcc –c test.s –o test.o

-c选项可以得到汇编代码转化为“xxx.o”的二进制目标代码了。


(4)链接

在成功完成以上步骤之后,就进入了链接阶段。

链接的主要任务就是将生成的各个“xxx.o”文件进行链接,生成可执行文件。

gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件。

实例:gcc test.o –o test

巧记:键盘左上角ESC分别对应预处理、编译、汇编。

若不用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out。

在我们编写代码时时常需要使用库函数中的函数,比如stdio.h中的printf函数,但当我们展开stdio.h文件后发现也只是有printf的函数声明,那么这些库函数的定义放在哪里了呢?

就以stdio.h头文件举例,里面的库函数实现在了名为libc.so.6(C标准库)的库文件中。在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现printf函数了,而这也就是链接的作用。


3.动静态库

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。

动静态库的优缺点对比:

动静态链接比对
链接方式库及特性Linux(后缀)Windows(后缀)
动态链接动态库(被多个使用者共同使用,一旦缺失,所有程序都不可以运行了).so.dll
静态链接静态库(不需要关联,将库文件代码直接拷贝到可执行文件中).a.lib

动态库

  • 优点:节省资源(包括磁盘、内存、网络等资源),不会出现太多重复代码。
  • 缺点:对库的依赖性较强,一旦库丢失,所有使用这个库的程序都无法运行。

静态库

  • 优点:不依赖库,同类型平台中都可以直接运行。
  • 缺点:可执行程序体积较大,比较浪费自愿。

动态链接实例:gcc -o mybin mytest.c(Linux默认)

静态链接实例:gcc -o mybin-static mytest.c -static


可利用file查看可执行文件的链接方式:

 比对下静态链接与动态链接生成的可执行文件的大小:

所以说静态链接安全可靠,但是浪费资源。 


可利用ldd 文件名查看可执行文件所依赖的库(当有缺失时会有提示):


4.gdb的使用

首先我们知道程序的发布方式有两种:

  • debug版本:程序本身会被加入更多的调试信息,以便于进行调试。
  • release版本:不会添加任何调试信息,是不可调试的。

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。

如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。


 🐸gdb语法速览🐸

【安装gdb】

  • sudo yum install -y gdb 

【进入gdb】

  • 指令: gdb 文件名

【调试】

  • 「run/r」:运行代码(启动调试)。
  • 「next/n」:逐过程调试。
  • 「step/s」:逐语句调试。
  • 「until 行号」:跳转至指定行。
  • 「finish」:执行完当前正在调用的函数后停下来(不能是主函数)。
  • 「continue/c」:运行到下一个断点处。
  • 「set var 变量=x」:修改变量的值为x。

【显示】

  • 「list/l n」:显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示.。
  • 「list/l 函数名」:显示该函数的源代码。
  • 「print/p 变量」:打印变量的值。
  • 「print/p &变量」:打印变量的地址。
  • 「print/p 表达式」:打印表达式的值,通过表达式可以修改变量的值。
  • 「display 变量」:将变量加入常显示(每次停下来都显示它的值)。
  • 「display &变量」:将变量的地址加入常显示。
  • 「undisplay 编号」:取消指定编号变量的常显示。
  • 「bt」:查看各级函数调用及参数。
  • 「info/i locals」:查看当前栈帧当中局部变量的值。

【断点】

  • 「break/b n」:在第n行设置断点。(多文件"在test.c文件的第7行"打断点:b test.c:7)
  • 「break/b 函数名」:在某函数体内第一行设置断点。
  • 「info breakpoint/b」:查看已打断点信息。
  • 「delete/d 编号」:删除指定编号的断点。
  • 「disable 编号」:禁用指定编号的断点。
  • 「enable 编号」:启用指定编号的断点。

【退出gdb】

  • 「quit/q」:退出gdb。

=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

=========================================================================

相关文章:

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

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.gcc/g语法 2.gcc的使用及…...

Google Guava 散列工具使用详解

文章目录 散列哈希函数哈希码布隆过滤器 散列 Guava 提供了一组散列(哈希)相关的工具类和方法,包括哈希函数接口、哈希算法实现、哈希码(HashCode)类、布隆过滤器(BloomFilter)等等。 Guava 提…...

AIGC-文生视频

stable diffusion的前传: 轻松理解 VQ-VAE:首个提出 codebook 机制的生成模型 - 知乎近两年,有许多图像生成类任务的前沿工作都使用了一种叫做"codebook"的机制。追溯起来,codebook机制最早是在VQ-VAE论文中提出的。相比…...

java中Collectors.groupingBy返回实例?

在Java中,Collectors.groupingBy()是一个用于对流元素进行分组的收集器。它可以根据指定的分类函数对流元素进行分组,并返回一个Map对象,其中键是分组的标准,值是属于相应组的元素列表。 下面是一个使用Collectors.groupingBy()方…...

uniapp打包的h5项目多了接口调用https://api.next.bspapp.com/client

产生跨域问题。 这个实际上是因为该项目在manifest.json文件中勾选了‘uni统计配置’导致的,取消勾选就可以了。 如果是小程序项目,在小程序开发者工具中添加可信任域名就可以了。 可以看看下面这个链接内容 uni-app H5跨域问题解决方案(…...

探索跨境建站:如何借助软骨鱼SaaS平台快速搭建独立站

随着全球电子商务的蓬勃发展,作为一名资深的跨境电商从业者,我深知跨境建站服务需要与时俱进,不断迈向更高效、更智能的2.0时代。今天,我想和大家分享一个让我眼前一亮的解决方案——软骨鱼SaaS平台,这个平台彻底颠覆了…...

C语言-字符串输入输出

字符串赋值 char *t “title”;char *s;s t;并没有产生新的字符串,只是让指针s指向了t所指的字符串, 对s的任何操作就是对t做的 字符串输入输出 char string[8];scanf(“%s”, string);printf(“%s”, string);scanf读入一个单词(到空格…...

OpenHarmony 设备启动Logo和启动视频替换指南

前言 OpenHarmony源码版本:4.0release 开发板:DAYU / rk3568 一、Logo替换 替换其中的logo.bmp 和 logo_kernel.bmp文件 注意事项: 1、图片的分辨率需要和设备匹配 2、如果是非首次编译(存在缓存)需要将out目录删…...

Python中函数添加超时时间,Python中signal使用

from time import time, sleepimport signal# 模拟要删除5条数据,中间有超时的i 5# 超时后执行的方法def timeout_handler(signal, frame):# 引发异常raise TimeoutError("删除第" str(i) "条,超时!")# 或者执行其他操作,不往外抛异常(超时的函数不会被…...

【C语言】递归详解

目录 1.前言2. 递归的定义3. 递归的限制条件4. 递归举例4.1 求n的阶乘4.1.1 分析和代码实现4.1.2 画图演示 4.2 顺序打印一个整数的每一位4.2.1 分析和代码实现4.2.2 画图推演 4.3 求第n个斐波那契数 5. 递归与迭代5.1 迭代求第n个斐波那契数 1.前言 这次博客内容是与递归有关&…...

NSSCTF 文件上传漏洞题目

目录 [SWPUCTF 2021 新生赛]easyupload1.0 [SWPUCTF 2021 新生赛]easyupload2.0 [SWPUCTF 2021 新生赛]easyupload3.0 [SWPUCTF 2021 新生赛]easyupload1.0 这是一个文件上传漏洞的题目 我们的思路是上传一句话木马,用工具进行连接 先编写一句话木马 将文件后缀…...

layui+ssm实现数据表格双击编辑更新数据

layui实现数据表格双击编辑数据更新 在使用layui加载后端数据请求时,对数据选项框进行双击即可实现数据的输入编辑更改 代码块 var form layui.form, table layui.table,layer parent.layer undefined ? layui.layer : parent.layer,laypage layui.laypag…...

windows下DSS界面本地集成linkis管理台

说明:当前开发环境为windows,node版本使用16.15.1。启动web时,确保后端服务已准备就绪。 1.linkis web编译 #进入项目WEB根目录 $ cd linkis/linkis-web #安装项目所需依赖 $ npm install参考官方编译说明,windows下编译一直异常…...

基于PaddleSeg开发的人像抠图web api接口

前言 基于PaddleSeg开发的人像抠图web api接口,提取官方代码,适配各种系统,通过api的接口进行访问。 环境要求 1、Python3.7以上 2、源码(文章最后下载) 源码结构 测试module.py中添加如下代码: if __na…...

Python---面向对象的基本概念

对象 对象,object,现实业务逻辑的一个动作实体就对应着OOP编程中的一个对象! 所以:① 对象使用属性(property)保存数据!② 对象使用方法(method)管理数据! …...

cv2.threshold 图像二值化

图像二值化 whatparameters示例 what cv2.threshold是OpenCV中用于进行图像二值化的函数。它的作用是将输入图像的像素值转换为两个可能的值之一,通常是0(黑色)或255(白色),根据一个设定的阈值。图像二值化…...

CRM:提升营销效果的关键

一场成功的营销活动,可以帮助企业扩大知名度,获取大量的优质商机。作为专业的管理软件,CRM系统同样具备营销管理的能力,帮助企业实现营销活动的规划、执行和监控,提高营销效果。下面说说,CRM营销自动化对企…...

AIGC: 关于ChatGPT中基于API实现一个StreamClient流式客户端

Java版GPT的StreamClient 可作为其他编程语言的参考注意: 下面包名中的 xxx 可以换成自己的代码基于java,来源于网络,可修改成其他编程语言实现参考前文: https://blog.csdn.net/Tyro_java/article/details/134748994 1 )核心代码结构设计 …...

FutureTask

1. 作用 异步操作获取执行结果取消任务执行&#xff0c;判断是否取消执行判断任务执行是否完毕 2. demo public static void main(String[] args) throws Exception {Callable<String> callable () -> search();FutureTask<String> futureTasknew FutureTask&…...

【力扣热题100】207. 课程表 python 拓扑排序

【力扣热题100】207. 课程表 python 拓扑排序 写在最前面207. 课程表解决方案&#xff1a;判断是否可以完成所有课程的学习方法&#xff1a;拓扑排序实现步骤Python 实现性能分析结论 写在最前面 刷一道力扣热题100吧 难度中等 https://leetcode.cn/problems/course-schedule…...

【滑动窗口】LeetCode2953:统计完全子字符串

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本题其它解法 【离散差分】LeetCode2953:统计完全子字符串 题目 给你一个字符串 word 和一个整数 k 。 如果 word 的一个子字符串 s 满足以下条件&#xff0c;我们称它是 完全字符串&#xff1a; s 中每个字符…...

base64转PDF

今天做皖事通的对接&#xff0c;下载电子证照后发现回传的是base64&#xff0c;调试确认是个麻烦事&#xff0c;网上搜了一下没有base64转PDF的在线预览功能&#xff0c;只能自己写个调试工具了&#xff0c;以下是通过纯JS方式写的代码&#xff0c;可直接拿去使用&#xff1a; …...

clip-path,css裁剪函数

https://www.cnblogs.com/dzyany/p/13985939.html clip-path - CSS&#xff1a;层叠样式表 | MDN 我们看下这个例子 polygon里有四个值分别代表这四个点相对于原图左上方的偏移量。 裁剪个五角星...

第二证券:食品饮料板块拉升,乳业股亮眼,西部牧业“20cm”涨停

证券时报网讯&#xff0c;食物饮料板块5日盘中拉升走高&#xff0c;乳业股体现活跃&#xff0c;到发稿&#xff0c;骑士乳业涨超27%&#xff0c;西部牧业“20cm”涨停&#xff0c;阳光乳业亦涨停。 其它个股方面&#xff0c;盖世食物涨超20%&#xff0c;润普食物涨超18%&#…...

React 好用的工具库

1、html-react-parser HTML 到 React 解析器&#xff0c;适用于服务器 &#xff08;Node.js&#xff09; 和客户端&#xff08;浏览器&#xff09;&#xff0c;适用于React节点修改过滤等需求 解析器将 HTML 字符串转换为一个或多个 React 元素。可以将一个元素替换为另一个元素…...

C++面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…...

Twincat功能块使用经验总结

控制全局变量&#xff1a; //轴控制指令 bi_Power: BOOL; //使能 bi_Reset: BOOL; //复位 bi_Stop: BOOL; //停止 bi_JogForward: BOOL; //正向点动 bi_JogBackwards: BOOL; //反向点动 bi_MoveAdditive: BOOL; //增量位…...

香港服务器时间不准,差8小时

解决方案1 1、timedatectl查看系统时间 2、查看系统时区 ls /usr/share/zoneinfo 3、删除当前系统所处时区 rm /etc/localtime 4、创建软链接&#xff0c;以替换当前的时区信息 ln -s /usr/share/zoneinfo/Universal /etc/localtime 解决方案2 手动设置硬件时钟 1、设置系…...

C++ 抽象类和接口 详解

目录 0 引言1 抽象类2 接口2.1 Java与C接口的区别 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;C专栏&#x1f4a5; 标题&#xff1a;C 抽象类和接口 详解❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01;&#x1f…...

【Linux】awk 使用

awk 输出 // 打印所有列 $ awk {print $0} file // 打印第一列 $ awk {print $1} file // 打印第一和第三列 $ awk {print $1, $3} file // 打印第三列和第一列&#xff0c;注意先后顺序 $ cat file | awk {print $3, $1} …...

中山市企业网站建设/龙南黄页全部电话

1. Karatsuba乘法 Karatsuba 乘法是一种快速乘法。此算法在1960年由 Anatolii Alexeevitch Karatsuba 提出&#xff0c;并于1962年得以发表。此算法主要用于两个大数相乘。普通乘法的复杂度是 n&#xff0c;而 Karatsuba 算法的复杂度仅为 3nlog2(3) 2. 算法原理 可以注意到…...

北京高端别墅设计公司/东莞整站优化排名

GraphMat: High performance graph analytics made productive GraphMat&#xff1a;高性能图分析提高生产力 [Paper] [Slides] [Code] VLDB’15 摘要 弥合用户友好的图分析框架和本地手动优化代码之间的差距 采用结点编程(前端)并将其映射到后端的高性能稀疏矩阵运算, 性能…...

wordpress log/品牌推广的作用

第一步进入wordpress后台(这是废话)&#xff0c;找到“外观”模块下面 的“编辑”选项&#xff0c;进入主题编辑选项;这一步太简单&#xff0c;就不截图了。 在模版里面点击“顶部(header.php)”模版&#xff1a; 关键词如何添加 在左侧的header.php编辑框中找到<header>…...

淘宝上网站开发/nba最新交易新闻

1.将一个给定的整型数组转置输出&#xff0c; 源数组为&#xff1a;1 2 3 4 5 6转置之后输出的数组为&#xff1a;6 5 4 3 2 1 刚看到题目的时候没多想&#xff0c;只想着能倒着输出就好&#xff08;正确代码错误想法&#xff09; public static void main(String[] args){int…...

合肥简川科技网站建设公司 概况/百度推广登录平台登录

项目管理利器&#xff08;Maven&#xff09;——依赖范围&#xff08;classPath&#xff1a;编译&#xff0c;运行&#xff0c;测试&#xff09;1.compile&#xff1a;默认范围&#xff0c;编译测试运行都有效2.provided&#xff1a;在编译和测试时有效3.runtime&#xff1a;在…...

南京网站建设多少钱/西安seo公司

本文仅代表 Phodal 的个人观点&#xff0c;来听听一个前端程序员的 YY。新一期的ThoughtWorks技术雷达有点出乎意料&#xff0c;使用new标签的框架、工具、技术、语言等等超过了一半——Vue.js、ES2017上榜&#xff0c;Three.js凭着VR的火又上榜了&#xff0c;还有熟悉的Electr…...