编译链接再认识+gdb认识+makefile了解

news2024/11/24 4:36:51

索引

  • 一. 编译链接再认识
      • 1.预处理
      • 2.编译
      • 3.汇编
      • 4.链接
          • 1.静态链接
          • 2.动态链接
  • 二.gdb
  • 三.makefile/make

一. 编译链接再认识

主要针对gcc展开
一个文件从源文件编译成可执行文件大致要经历四个步骤

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 链接(生成可执行文件或库文件)
    现有如下源码,下面展示几个阶段此源码会到达的阶段
#include<stdio.h>
  2 #define M 9
  3 #define DEBUG
  4 int main()
  5 {
  6 
  7   printf("hello world %d !\n",M);
  8   printf("这是一个测试\n");
  9   //这是一个注释,是否会被去除
 10 #ifdef DEBUG 
 11   printf("hello debug!\n");
 12 #else 
 13   printf("hello release!\n");
 14 #endif
 15   return 0;
 16 }   

1.预处理

命令行:gcc -E test.c -o test.i
预处理的主要功能包括宏定义,文件包含,条件编译,去注释等
预处理的指令是以#开头的代码行
-E:使得gcc在预处理结束之后停止编译
-o:值生成的目标文件

在这里插入图片描述
根据上述可以发现,前面800多行都是头文件预处理展开的结果,预处理去掉了宏定义同时,条件编译也没了,注释也没了
注意编译器内部都必须通过一定的方式,知道你所包含头文件所在路径
Linux所有源文件都会安装在/usr/include/
在这里插入图片描述

2.编译

gcc -S test.i -o test.s
从现在开始进行程序的翻译,编译完成之后就停下来
同时在这个阶段gcc首先要检查代码的规范性,是否有语法错误
检查无误后将代码翻译成汇编语言

在这里插入图片描述
可以发现上述已经生成了汇编语言

3.汇编

gcc -c test.s -o test.o
汇编阶段将编译生成的.s文件转化成目标文件
将汇编语言翻译成机器可识别的可重定位的二进制文件.o

在这里插入图片描述

在链接之前,我们要思考一个问题:
我们上述三步编译的是谁的代码?
只编译了自己的代码,我们代码中还有printf库函数,我们没有编译,我们只是调用了一下,
所以:如何和目标的printf的实现产生关联呢?
链接

4.链接

gcc test.o -o test
预编译中的“stdio.h”中只有该函数的申明没有该函数的实习,即使知道函数的视线是在库中,如何找到?
系统把这些函数实现都放在名为lib.so.6的库文件中,在没有特别指定时,gcc会到系统默认的搜索路径/usr/lib下
进行查找,也就是连接到lib.so.6的库函数中去寻找,这样就能找到上述printf函数的定义了。

在这里插入图片描述
链接是链接到函数库,函数库一般有两种:动态库和静态库,所有链接也就有两种
静态链接和动态链接

1.静态链接

gcc test.c -o test_static -static
-static:表示此时编译链接是链接静态库的

编译链接时,将库中的相关代码,直接拷贝到可执行程序中。
优点:不依赖任何库,程序可以独立执行
缺点:产生的文件比较大,比较浪费资源
静态库的后缀名一般是".a"

2.动态链接

编译链接时:没有把库文件的代码加入到可执行文件中,而是在程序执行时,由运行时链接文件加载库,节省系统的开销,
动态库的后缀一般是".so"
优点:大家共享一个库
缺点:一旦其中有一个库缺失,会导致几乎所有的程序失效

在这里插入图片描述
根据上述可以看到,静态链接的文件比动态链接的文件要大很多
**ps:**默认gcc是动态链接的

二.gdb

程序发布有两种方式:
debug+release
Linux gcc/g++出来的二进制程序,默认是release模式
而调试只能是debug模式下的二进制程序
在编译链接时要加 -g选项
gcc test.c -o test_g -g
在这里插入图片描述
发现debug的二进制文件比release下的二进制文件大,因为添加了调试信息
上述代码不便于调试,另写源码调试
gdb需要掌握以下几点就可以了,不用完全掌握

使用了解:
gdb filename 开始使用
quit:退出
l 行号:显示代码
b 行号:在某一行打断点
d 断点编号:取消断点
s :step,逐语句(进入函数)
n:next,逐过程
display&&undisplay:常显示或取消常显示
until 行号:跳转到指定行
r:运行程序,没有断点直接运行完,有断点运行到第一个断点处
c:从一个断点,之间跳转到另外一个断点
finish:当在一个函数时,执行完一个函数就停下来
info break:查看断点信息
p 变量:打印变量的值
set val:改变变量的值

在这里插入图片描述

三.makefile/make

是什么?
make和makefile是软件开发中非常重要的工具,可以自动化构建和管理项目代码,提高开发效率和代码质量.
make是一个命令工具,是一个解析makefile的命令工具,根据文件的依赖关系,自动编译源代码。
makefile是一个文本文件,包含了一系列规则,用于告诉make如何构建。在makefile中还可以定义变量,变量用于
存储一些常量或者配置信息
总结:make会根据makefile中的依赖关系调用对应的依赖方法,生成对应的可执行文件

为什么需要他们?
如果我们一个项目有多个源文件,源文件之间先编译哪个,后编译哪个关系很难捋清楚,
如何构成可执行程序需要我们手动维护,如果其中一个源文件修改了一部分,我们还是需要
全部编译一遍,用make虽然也要手动维护,但是只需要维护一次就可以了。只要我们维护好了
文件与文件之间的关系,生成可执行文件的时候只需要make一下就可以了。
怎么做?如何使用make编译生成可执行文件
下列是一个最简单的makefile,通过这个简单的makefile来展示

在这里插入图片描述
在这里插入图片描述
上述提到,如果给目标文件也加.PHONY
那么输入命令make的时候目标文件都会被生成的,但一般不会加.PHONY
此时只有目标文件不存在或者其中一个依赖文件的时间戳比目标文件的时间戳更新的时候,
make才会执行依赖方法生成目标文件。
ps:如果源文件改了,那么依赖文件的时间戳肯定比目标文件的时间戳更新,此时make
又可以生成新的目标文件了

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Pandas] 创建透视表与交叉表

1.生成透视表 在使用Python处理数据时&#xff0c;我们希望能够快速地进行排列与计算数据&#xff0c;从而帮助我们更有效的分析数据&#xff0c;pivot_table函数可以实现Excel数据透视表的功能 基本语法格式 pd.pivot_table(data, valuesNone, indexNone, columnsNone, agg…

【51单片机】使用STC烧录软件生成定时器的代码以及注意事项

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 1.点击定时器计算器​编辑 2.每次打开的时…

华为MPLS跨域C1方式RR场景(数据不经过RR)实验配置

目录 配置BGP邻居的建立 配置MPLS LDP 配置RR之间的MP-BGP邻居 配置通过ASBR学习PE路由并为PE分配标签&#xff08;实现Vpnv4路由的传递和数据传输&#xff09; 根据图配置接口的IP地址和IGP协议 BGP邻居用来传递标签和RR、PE的路由 MP-BGP邻居用来传递Vpnv4路由 配置BG…

QGC分析(一)-整体分析和通信流程

参考QGroundControl开发指南 设计理念 QGC用户界面是用QML实现的。 构建 可以按照这一篇来在Windows中下载源码并且编译。QGroungControl在QT中源码编译&#xff08;包括配置环境&#xff09; 通信流程 src/comm/LinkManager.cc LinkManager始终打开UDP端口&#xff0c;…

Vue3中如何实现数字翻牌效果?

一、需求 监听数据的变化&#xff0c;实现数字翻牌效果 本人OS:本想截一个gif&#xff0c;但是一直没找到合适的截gif工具......有好用的截gif工具&#xff0c;跪求戳戳我~ 二、思路 1.设置初始数组&#xff1a;[0] 2. 把获取到的新数据整个数字用逗号隔开&#xff0c;组成…

让Bito帮你写Mokito单元测试

前言 现在稍微大一点的公司应该都有单测覆盖率要求&#xff0c;比如核心工程单测覆盖率95%以上&#xff0c;非核心工程90%以上。单测可以降低开发错误的反馈回路&#xff0c;减少重复工作&#xff0c;提升开发效率。但是写单测对于开发来说需要额外的时间。我们可以用TestMe、…

AdaBoost算法介绍和代码实现

AdaBoost算法介绍和代码实现 算法原理 AdaBoost算法的核心思想是将弱分类器组合成一个强分类器。在每一轮迭代中&#xff0c;AdaBoost会训练一个新的弱分类器并调整每个样本的权重&#xff0c;使得之前分类错误的样本在下一轮迭代中受到更多的关注。最终&#xff0c;AdaBoost…

认识监听器(Listener)

监听器是什么&#xff1f; 监听器&#xff08;Listener&#xff09;是一种运行在后台的程序&#xff0c;它主要用于监控某些事件在系统中的发生&#xff0c;并且根据这些事件做一些特定的处理。在Web应用程序中&#xff0c;监听器可以观察ServletContext、HttpSession以及Serv…

PostgreSQL-数值类型

数值类型是最常用的几种数据类型之一&#xff0c;主要分为&#xff1a; 整型浮点型精确小数 数值类型介绍 数值类型列表 类型名称存储空间描述范围smallint2字节小范围的整数。Oracle中没有此数值类型&#xff0c;使用number代替-2^15 ~ 2^15-1int 或 integer4字节常用的整数…

日常开发为什么需要做Code Review

日常开发为什么需要做Code Review 一、背景 最近在开始一个新的项目&#xff0c;在查看项目中代码及具体细节时&#xff0c;发现这个项目真实一堆乱麻&#xff0c;没有规律可循&#xff0c;可总结下这个项目的缺陷 没有规律可循&#xff0c;没有结构性设计不做公共封装&#…

08_Uboot顶层Makefile分析_make过程

目录 make 过程 make 过程 配置好 uboot 以后就可以直接make 编译了,因为没有指明目标,所以会使用默认目标,主 Makefile 中的默认目标如下: 目标_all 又依赖于all,如下所示: 如果KBUILD_EXTMOD为空的话_all 依 赖 于all 。这 里 不 编 译 模 块,所 以KBUILD_EXTMOD肯定为空,_…

二分分类.

2.1 二分分类 在神经网络的计算中&#xff0c;通常先有一个叫做前向暂停(forward pause)或叫做前向传 播(foward propagation)的步骤&#xff0c;接着有一个叫做反向暂停(backward pause) 或叫做反向传播 (backward propagation)的步骤。 一张图片在计算机中是如何表示的&…

4。计算机组成原理(1)数据表示和运算

嵌入式软件开发&#xff0c;非科班专业必须掌握的基本计算机知识 核心知识点&#xff1a;数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 一 进位计数法和不同进制数的相互转换 其他进制(b)&#xff0c;转十进制的计算公式 十进制数&#xff0c;转…

Linux系统编程——多线程[上]:线程概念和线程控制

目录 1.再谈页表 2.Linux线程概念 2.1pthread原生库的基本使用 2.2PID和LWP 2.3Linux线程的资源以及优缺点 2.4Linux线程健壮性问题 2.5可重入函数和线程独立栈 3.Linux线程控制 3.1Linux线程终止 3.2Linux线程等待 3.3线程取消 3.4线程分离 使用线程库的注意事项…

【Python入门】Python基础语法

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

净利润同比增长48.9%,中国平安“一览众山小”

中国平安价值迸发的速度&#xff0c;或许超过了所有人的想象。 4月26日晚&#xff0c;中国平安发布2023年一季度业绩报告&#xff0c;许多自媒体用“炸裂”来形容其亮眼的财务数据。财报显示&#xff0c;第一季度&#xff0c;集团实现营收2537.78亿元&#xff0c;同比增长30.8…

农机电招平台~java

摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变…

LeetCode:383. 赎金信

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[383. 赎金信](https://leetcode.cn/problems/ransom-note/)…

DOM概述

DOM概述 什么是DOM对象树化的DOM模型DOM 节点 如何获取DOM元素如何更改我们的DOM模型常用属性修改控制样式属性 事件事件监听 事件类型鼠标事件键盘事件焦点事件文本框输入事件 事件对象回调函数DOM 节点插入节点插入节点删除节点查找节点父子关系兄弟关系 什么是DOM 当网页被…

SPSS如何进行因子分析和主成分分析之案例实训?

文章目录 0.引言1.因子分析2.主成分分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对因子分析和主成分分析进行阐述。 1.因子分…