编译链接再认识+gdb认识+makefile了解+缓冲区的理解+进度条的实现

news2024/11/20 10:27:48

索引

  • 一. 编译链接再认识
      • 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
又可以生成新的目标文件了

在这里插入图片描述

在这里插入图片描述

索引

  • 一. 编译链接再认识
      • 1.预处理
      • 2.编译
      • 3.汇编
      • 4.链接
          • 1.静态链接
          • 2.动态链接
  • 二.gdb
  • 三.makefile/make
  • 四.缓存区的理解
    • 五. 进度条的实现

四.缓存区的理解

#include<stdio.h>
  2 #include<unistd.h>
  3 int main()
  4 {
  5   printf("hello world!");
  6   sleep(2);
  7   printf("\n");
  8   return 0;                                                                                                                       
  9 }

上述代码在执行之后,会发现是过了两秒hello world才会被打印出来
为什么会这样呢?
因为缓冲区的存在,缓冲区在计算机中通常指的是一块内存区域,用于存储临时数据,提高数据读写的效率和稳定,不然来一点数据就要发送,效率太低,因此只要在缓冲区满了或者是达到一定条件时,才会将数据输出。而在c语言中这个条件是行刷新或者缓冲区满了,或者程序退出了也可以强制刷新到标准输出上:fflush(stdout)

拓展:
缓存区的大小可以根据需要设置,一般情况下,缓冲区的大小越大,可以存储的数据量越多,读写效率也越高,这也意味着会消耗更多的内存资源,因此在设置缓冲区大小的时候要权衡内存资源和读写之间的关系。

五. 进度条的实现

#include<iostream>
  2 #include<unistd.h>
  3 #include<cstring>
  4 using namespace std;
  5 #define NUM 101
  6 #define STYLE '#'
  7 int main()
  8 {
  9 
 10   char bar[NUM];
 11   memset(bar,'\0',sizeof(bar));
 12   const char *lable = "|/-\\";//假装在转动
 13   int cnt = 0;
 14   while(cnt <= 100)
 15   {
 16     printf("加载中: %-100s %d%% %c\r",bar,cnt,lable[cnt%4]);
 17     fflush(stdout);
 18     bar[cnt++] = STYLE;
 19     usleep(20000);//微秒                                                                                                          
 20   }
 21   printf("\n");
 22 
 23 
 24   return 0;
 25 }

运行截图
在这里插入图片描述

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

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

相关文章

office@word官方文档查看@审阅@批注@修订

文章目录 office官方文档microsoft office 文档教程语言切换文档官网word官方培训资源找到合适的文档 word共享共同创作的相关支持word审阅重点修订批注审阅窗格右侧边窗格修订选项区分标记和修订 officeword官方文档查看审阅批注修订 office官方文档 microsoft office 文档教…

国家信息安全水平考试中NISP三级(专项)网络安全证书介绍

国家信息安全水平考试中NISP三级&#xff08;专项&#xff09;网络安全证书介绍 ​1、什么是NISP? 国家信息安全水平考试&#xff08;National Information Security Test Program&#xff0c;简称NISP&#xff09;&#xff0c;是由中国信息安全测评中心实施培养国家网络空间…

c++ 11标准模板(STL) std::vector (六)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…

I/O常用扩展方法与芯片

主要有四种I/O扩展方法&#xff1a; (1)并行总线扩展的方法 (2)串行口扩展方法 (3)I/O端口模拟串行方法 (4)通过单片机内I/O的扩展方法 IO口扩展可以通过以下芯片来实现&#xff1a; 1、并行扩展芯片&#xff0c;比如8255 &#xff0c;8155等。 2、锁存器或缓冲器来扩展&#x…

README.md编写

一、摘要 项目一般会有个描述文件&#xff0c;对于项目的代码来讲&#xff0c;这个描述就是README.md文件&#xff0c;可以描述各模块功能、目录结构等。该文件可以方便让人快速了解项目的代码结构和功能。当然&#xff0c;若要深层次的了解项目&#xff0c;就得看项目总体的需…

Postman(接口测试工具)使用教程

目录 Postman(接口测试工具) Postman 介绍 Postman 相关资源 Postman 安装 具体安装步骤 ● 安装 Postman 快速入门 快速入门-实现步骤 其它说明 Postman(接口测试工具) Postman 介绍 1. Postman 是一款功能超级强大的用于发送 HTTP 请求的 测试工具 2. 做 WEB 页面开…

(MAX5048BAUT+T)ASEMI代理美信MAX5048BAUT+T车规级芯片

编辑-Z MAX5048BAUTT特征&#xff1a; 型号&#xff1a;MAX5048BAUTT 可控上升和下降时间的独立源和汇输出 4V至12.6V单电源 7.6A/1.3A峰值吸收/源极驱动电流 0.23Ω 开路漏极N沟道吸收输出 2.Ω 漏极开路P通道源极输出 12ns&#xff08;典型&#xff09;传播延迟 反相…

Mybatis方式完成CRUD操作

Mybatis方式完成CRUD操作 文章目录 Mybatis方式完成CRUD操作1、java以Mybatis方式操作DB1.1、配置数据源-创建 resources/mybatis-config.xml1.2、创建java bean-Monster1.3、配置Mapper接口声明方法1.4、配置xxMapper&#xff0c;完成SQL配置,实现CRUD操作1.5、Test测试 2、需…

AI生成天空盒!泰裤辣!

我经常做一些奇奇怪怪的梦&#xff0c;醒来的时候特别想把这些NB的场景给画下来分享给别人。 我尝试过AI绘画&#xff0c;但是还没达到我想要的那种沉浸的效果。如果能通过我的描述生成3D场景就好了。 直到我发现了它&#xff01; 先来欣赏一下它的杰作&#xff1a; 这个工具通…

微信公众号扫码登录(一)—— 获取微信公众号二维码

引言 这几天在研究微信登录&#xff0c;今天解决了获取微信二维码问题&#xff1b;在这里总结一下 关于微信登录想说的话 第一次接触微信登录&#xff0c;开始就弄混了登录方式&#xff1b;简单来说&#xff0c;微信扫码登录分为两种&#xff0c;一种是微信公众平台&#xf…

SAP 从入门到放弃系列之工作中心(workcenter)

目录 概念 数据收集 主要配置点&#xff1a; 工作中心类别 工作中心字段选择 工作中心公式 标准值码 工作中心位置 工序控制码 概念 工作中心是为制造过程增加价值的一台机器或一组机器、一个人或一组人&#xff0c;或一组人和机器。 数据收集 在 实施项目期间&#x…

汉诺塔问题(解出来了带你看洛丽塔)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《算法详解》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将算法知识一网打尽&#xff0c;希望可以…

[230508]托福听力真题TPO66|词汇总结| 精听|19:30~20:10 20:50~23:00 8:30~9:40

TPO66 L1&#xff1a; 3/6 TPO66 L2&#xff1a; TPO66 L3&#xff1a; 目录 TPO66 C1 一、要点 二、文本 三、文本注释 四、复听笔记 TPO66 C2 一、要点 二、文本 三、文本注释 四、复听笔记 TPO66 L1 重点词汇 TPO66 L2 重点词汇 TPO66 L3 重点词汇 TPO66 C1 一、要点 …

大家都去荷兰注册公司到底是为了什么?

荷兰位于欧洲大陆西北部&#xff0c;北濒北海&#xff0c;与德国和比利时接壤。国土总面积为41528平方公里&#xff0c; 2020年2月人口达1741万人。荷兰是中国企业海外投资的重要目的地国之一。目前&#xff0c;中国是荷兰至二大外资项目来源国。据荷方统计&#xff0c;目前&am…

用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

很好&#xff0c;但还不能取代专家导师&#xff0c;有时还会犯错&#xff01; ChatGPT 教小狗编程&#xff08; Midjourney 创作&#xff09; GPT-4刚刚发布&#xff0c;相较于GPT-3.5&#xff0c;它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下&#xff0c;…

Java程序设计入门教程--数组

目录 一、一维数组创建 1. 定义数组 &#xff08;1&#xff09;声明 &#xff08;2&#xff09;分配数组内存空间 2. 数组初始化 &#xff08;1&#xff09;静态初始化 &#xff08;2&#xff09;动态初始化 3. 一维数组的拷贝 &#xff08;1&#xff09;数组元素的拷…

家用洗地机哪种好?怎么选购家用洗地机

在这个高度关注环境、健康和安全的时代&#xff0c;洗地机已成为多种设施不可或缺的清洁工具。它不仅可以提高清洁速度和质量&#xff0c;还可以协助您提高生产效率和管理流程。洗地机的优点在于它易于使用&#xff0c;具有多种高效能力和灵活性&#xff0c;是一个为现代清洁服…

(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析

链表面试题 203. 移除链表元素题目解法一&#xff1a;递归解法二&#xff1a;迭代 206. 反转链表题目解法一&#xff1a;递归解法二&#xff1a;迭代 876. 链表的中间结点题目解法一&#xff1a;快慢指针法解法二&#xff1a;单指针法 链表中倒数第k个结点题目解法 21. 合并两个…

22.碳交易机制下考虑需求响应的综合能源系统优化运行

说明书 MATLAB代码&#xff1a;碳交易机制下考虑需求响应的综合能源系统优化运行 注意&#xff1a;另外还有含义柔性负荷、蓄冷式空调、共享储能以及碳捕集的综合能源系统优化运行代码&#xff0c;欢迎咨询 关键词&#xff1a;需求响应 碳交易机制 日前优化调度 综合能源系统…

pdf怎么分割成一页一页的文件?

pdf怎么分割成一页一页的文件&#xff1f;相信很多使用电脑办公的小伙伴们都知道&#xff0c;无论是pdf文件还是ppt文件其都是由很多页组成的。一般当我们需要其中的部分内容时候&#xff0c;可以通过手动的方式将ppt文件来拆分成一页一页的来使用。但是这种手动的方法对于pdf文…