Linux中gcc/g++ gdb make/Make 的基本使用和理解

2023-11-17

1. gcc/g++的基本使用

  1. gcc和g++是两种编译器,也就是用来编译c/c++源文件的编译器,其中,gcc用来编译c语言,而g++用来编译c++;
  2. 当然由于c++兼容c,所以说,g++也是可以编译c语言源文件的,但是我们不经常这么做;
  3. gcc和g++的使用没有区别,区别的地方就是编译不同的源文件;
  4. 所以说,我们只要知道如何编译c语言的源文件,那么我们就会编译c++源文件了;也就是说gcc会使用,g++也会使用;

gcc的一般选项使用:

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

而一个C语言源文件到可执行文件中,是需要经过以下4个步骤;

预处理(进行宏替换)

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

编译(生成汇编)

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

汇编(生成机器可识别代码)

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

链接(生成可执行文件或库文件)

在成功编译之后,就进入了链接阶段
gcc hello.o -o hello


当然,我们正常使用gcc,并不需要拆解4个步骤使用;
而是可以直接gcc hello 就会默认生成一个a.out的可执行程序了;


2. 静态库,动态库的基本概念

形式上:Linux中静态库是以 。a 结尾;动态库是以 .so结尾;

  1. 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”;
  2. 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”;
  3. gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello
  4. gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证;

其实简单的说,静态库是复制别人写好的代码,到你写的代码中,你就可以直接调用静态库的函数使用了;
而动态库,就是你写的代码,去调用别人的库,在别人的库中执行完代码,再把代码的结果返回到你的源程序,然后你再继续执行;就是类似这种感觉;动态库不好的就是,库的有和没有,都是不确定的,你不知道链接到的动态库是否还存在,假如不存在了,那么你就会无法链接成功;
在这里插入图片描述
在这里插入图片描述


我们通过file 命令查询一下,默认gcc编译是否为链接动态库;
在这里插入图片描述


3. gdb的基本使用

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


-g选项是给可执行二进制文件加上了可调式信息;


测试假如不加-g选项时候,gcc编译的源文件是否可以调试
在这里插入图片描述


通过 readelf -S 命令查看a.out文件的短信息,发现也没有debug信息
在这里插入图片描述


加 -g选项 gcc 编译后,再用 readelf -S 查看 a.out的短信息;
多了debug信息:说明可以调试该文件;
在这里插入图片描述


gdb常用的调试命令:

l或 list 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
l或 list 函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行。也可以逐过程执行
s或step:进入函数调用,单步执行
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
finish:执行到当前函数返回,然后停下来等待命令
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。打印一次,之后不会再显示
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

l 1 表示从第一行开始显示代码,假如直接l的话,那么不会从第一行开始显示,会按默认方式显示代码;
使用 l 1后,之后可以直接l, 这样可以直接显示后面的一些代码;


gdb调试还是要自己多尝试,才会熟悉如何使用该工具;


make/Make 的基本使用

在这里插入图片描述
打开Makefile文件写入图下面的内容
在这里插入图片描述
make编译后,就可以形成可执行文件了;
在这里插入图片描述
如果要删除:用rm mybin就行;但是这种方式比较坨;
我们可以在Makefile文件里编写如下指令:
在这里插入图片描述
然后再敲 make clean 就可以清理项目了,也就是可以清理可执行文件 mybin;


原理讲解
在这里插入图片描述
语法:
在这里插入图片描述
编写makefie就是编写依赖关系和依赖方法


在这里插入图片描述
总是被执行的理解
在这里插入图片描述
有了伪目标执行多次也没关系。如下图:伪目标的是被.PHONY:修饰的
在这里插入图片描述
在这里插入图片描述
编译项目是有成本的,上面的多次编译的方式是不推荐的,所以不希望可执行文件被修饰伪伪目标


从大方向理解Makefile
在这里插入图片描述


最终的Makefile的写法
在这里插入图片描述
上面的 图代码
%.o:%.c
gcc -c $<
等价下面的图
在这里插入图片描述
有了最终版本的Makefile 以后只要编译文件,如果有更多的.c文件那么只需要修改第一行的依赖关系列表那些.o文件就可以了;
当然如果多到很多的.c文件,依次的些.o文件不现实,我们makefile是由专门的函数处理的。但是这个以后再讲;


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux中gcc/g++ gdb make/Make 的基本使用和理解 的相关文章

随机推荐

  • java 异常 理解_java异常理解(1)

    JAVA异常处理机制 1引子 try catch finally恐怕是大家再熟悉不过的语句了 而且感觉用起来也是很简单 逻辑上似乎也是很容易理解 不过 我亲自体验的 教训 告诉我 这个东西可不是想象中的那么简单 听话 不信 那你看看下面的代
  • 光流估计(对视频处理+python实现+原理+实验报告)

    资源 光流估计 对视频处理 python实现 原理 实验报告 实现效果 相关原理 光流是空间运动物体在观测成像平面上的像素运动的 瞬时速度 根据各个像素点的速度矢量特征 可以对图像进行动态分析 例如目标跟踪 亮度恒定 同一点随苕时间的变化
  • 植被物候参数遥感研究进展(好文分享)

    在气候变化背景下 植被物候作为生态系统对环境变化响应的直接体现方式 日益受到学界关注 获取长期 连续 多尺度的植被物候数据是物候研究的基础 而利用卫星遥感手段获取的物候参数已经成为陆地生态系统变化研究的重要指标 遥感物候参数在农业生产管理
  • 530 Please login with USER and PASS.

    安装 npm install save hexo deployer ftpsync 配置 deploy type ftpsync host xx xx xx xx user bxu123123 pass xx11123 remote htd
  • C++ RSA加解密

    原文链接 https blog csdn net u011029517 article details 79392522 之前需要用到RSA加解密的时候花费了我不少的时间 网上有很多RSA加解密的文章 但大多数都是从文件读取公钥或者私钥的
  • 字节跳动五面都过了,结果被刷了,问了hr原因竟说是...

    摘要 说在前面 面试时最好不要虚报工资 本来字节跳动是很想去的 几轮面试也通过了 最后没offer 自己只想到几个原因 1 虚报工资 比实际高30 2 有更好的人选 这个可能性不大 我看还在招聘 我是面试Android开发的 3年经验 下面
  • linux clamav 免费查毒工具

    linux下需要杀毒工具吗 我一直认为是不要的 基于linux的病毒很少 linux 安全防护也做的很好 一般很难功破 我想那些 们更喜欢 写windows下的病毒 用的人多啊 传播也容易 下面的操作 都是以管理员的身份来进行的 一 安装c
  • Java各种系统架构图及其简介

    1 spring架构图 Spring是一个开源框架 是为了解决企业应用程序开发复杂性而创建的 框架的主要优势之一就是其分层架构 分层架构允许您选择使用哪一个组件 同时为J2EE应用程序开发提供集成的框架 Spring框架的功能可以用在任何J
  • 使用Xshell7控制多台服务同时安装ZK最新版集群服务

    一 环境准备 主机名称 主机IP 节点 集群内通讯端口 选举leader clinet端提供服务 端口 docker0 192 168 1 100 node 0 2888 3888 2181 docker1 192 168 1 101 no
  • 61.(前端)权限管理实现——从数据库中获取数据展示在前端,使用插槽和Tag标签美化数据展示

    1 概述 本次内容 主要是对用户权限列表进行展示 2 基本流程 在component文件夹下创建power文件夹 并在power文件夹下创建Menu vue 在Menu vue任意编写显示内容 用于测试 去router index js挂载
  • 解决Scrapy使用pipline保存到数据库后返回None

    这也不算报错哈 解决方法 在process item处理完成后返回item即可 return item 案例分析 比如下面的pipeline class MyPipeline object def init self host 127 0
  • Flask 实现文件上传和下载(简单但实用)

    目录结构和代码 root master w upload ll total 4 0K drwxr xr x 3 root root 21 Jul 2 17 32 static drwxr xr x 2 root root 25 Jul 5
  • Android在EditText中只能输入中文或者指定类型的内容

    之前做过一个需求 在EditText中只能输入中文或者英文字符不能输入特殊字符和数字等一些其他内容 查阅了一些资料 需要重写一下EditText中的相关方法就可以完成该功能 总结一下 方便之后使用 看一下效果图 可以看到在EditText中
  • Redis系列之二:Redis基础知识

    引言 正所谓万丈高楼平地起 学习一项技术都需要从其基础知识开始 上一篇介绍了Redis在Linux环境下的安装步骤 本文主要介绍了Redis的基础知识 包括数据结构以及常用命令等 废话不多说 我们直接开始吧 Redis基础数据结构 Redi
  • GPT-4 的创造力全方位持平或碾压人类

    文章目录 一 前言 二 主要内容 三 总结 CSDN 叶庭云 https yetingyun blog csdn net 一 前言 最近 一项有关 GPT 4 的创造力思维测试火了 来自蒙大拿大学和 UM Western 大学的研究团队发现
  • 工作——自动化测试中用到的SQL server查询语句的格式调整

    SELECT CONVERT VARCHAR 100 GETDATE 0 05 16 2006 10 57AM SELECT CONVERT VARCHAR 100 GETDATE 1 05 16 06 SELECT CONVERT VAR
  • 深入理解sed模式空间——sed ‘n;p‘

    在进入正题之前我们先来了解一下sed的模式空间 如下 什么是sed的模式空间 答 仅供参考 就是从文件读取一行文本然后存入的缓冲区 然后命令操作模式空间的内容 在初始状态下模式空间是没有内容的 在每次循环读取数据的过程中 模式空间都会被清空
  • Mybatis+Mysql 实现树形结构查询

    Mybatis
  • v3+element管理系统----主题定制 && 刷新 && 全屏

    目录 暗黑模式 如何启用 应用 自定义主题 应用 全屏 刷新 router view的v slot transition 标签 动态组件 nextTick 暗黑模式 现在 Element Plus 终于支持了暗黑模式 我们提取并整理了所有的
  • Linux中gcc/g++ gdb make/Make 的基本使用和理解

    1 gcc g 的基本使用 gcc和g 是两种编译器 也就是用来编译c c 源文件的编译器 其中 gcc用来编译c语言 而g 用来编译c 当然由于c 兼容c 所以说 g 也是可以编译c语言源文件的 但是我们不经常这么做 gcc和g 的使用没