Makefile学习③:编译流程

news2024/10/6 22:18:54

Makefile学习③:编译流程

学习前准备

实现七个文件的编写,例如:实现加减乘三个函数的.c文件和.h文件的编写加上主函数main.c,方便后续使用Makefile将其分别编译。
博主的demo如下:

在这里插入图片描述
使用gcc 命令将所有文件编译出来生成a.out文件,执行a.out(博主的a = 1,b = 2)

在这里插入图片描述

使用Makefile进行编译

一:创建一个Makefile文件将编译命令输入并执行。

main:
	gcc add.c sub.c multi.c main.c

结果如图所示
在这里插入图片描述

二:优化Makefile文件
如一所示的Makefile文件能够实现我们的目标,但是这样的写法对于庞大的项目来说并不完美,我们进行如下的改动:

main:add.o sub.o multi.o
	gcc add.o sub.o multi.o main.c -o main

add.o :add.c
	gcc -c add.c -o add.o
	
sub.o :sub.c
	gcc -c sub.c -o sub.o
	
multi.o :multi.c
	gcc -c multi.c -o multi.o

进行编译会生成:可执行文件main以及add.o,sub.o,multi.o三个二进制文件
在这里插入图片描述
如此修改的目的是为了使得多个文件同时被依赖的时候,若其中仅有一个文件被修改,则无需将全部文件重新编译,而只编译被修改的文件即可,大大节省文件编译的时间,如下图所示,博主修改了加法函数中的运算规则,然后重新编译并执行。
在这里插入图片描述
可以看到重新执行make命令,系统仅重新编译了add.o文件

gcc/g++ 编译流程

gcc main.c -o main  #直接从源代码到目标可执行文件

把过程拆分:
在这里插入图片描述
例如:
预处理:gcc -E main.c 得到 main.i的扩展源代码
编译:gcc -S main.i 得到 main.s的汇编文件
汇编:gcc -c main.s 得到main.o(.obj)的二进制文件
链接:gcc main.o add.o sub.o multi.o 将需要的二进制文件进行链接生成a.out可执行文件

详解可见:C语言的编译过程详解

由此可见使用Makefile进行分别编译,其实就是将汇编和链接的过程进行分部处理,以保证项目的可移植性和模块化。

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

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

相关文章

线程控制--Linux

文章目录线程理解线程的优点与缺点进程的多个线程共享线程控制线程创建线程终止线程等待线程分离总结线程理解 谈及线程,就不得不谈起进程与线程的关系了。学习完前面有关进程的知识,之前我们对进程的定义是:内核数据结构代码和数据。但是今…

C语言return的用法详解,C语言函数返回值详解

函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。return 语句的一般形式为:return 表达式;或者:return (表达式);有没有( )都是正确的,为了简明,一般也不写…

python使用类装饰器生成函数的使用日志

1 什么是类装饰器 在了解类装饰器之前,建议大家先了解装饰器的概念。 装饰器知识快速入门链接 类装饰器是 Python 中的一种特殊类型的装饰器,它是一个类而不是一个函数。与函数装饰器不同,类装饰器可以在运行时接收参数并返回一个可调用的对…

Linux文件系统(IO缓冲区+磁盘+软硬链接)

目录 一、缓冲区 1.1 缓冲区是内存的一块存储空间 1.2 缓冲区的作用 1.3 C式缓冲区 1.3.1 C语言的FILE结构体 1.3.2 C式缓冲区刷新策略 二、OS与内核缓冲区 2.1 数据从缓冲区到磁盘 2.2 fsync() 数据免缓冲直接到磁盘文件 2.3 检验用户与内核缓冲区 三、文件系统 3…

11. 好客租房-ElasticSearch入门学习

Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来…

分享144个ASP源码,总有一款适合您

ASP源码 分享144个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 144个ASP源码下载链接:https://pan.baidu.com/s/15O9p6a8XlNN0u-wFKEkJqQ?pwd8354 提取码&#x…

Go 语言

Go语言是云计算时代的语言 Go语言2007年诞生于Google,2009年开源,Go语言与区块链技术一样年轻 本文是对Go语言基本语法的总结 目录 Go词法单元 token Go的token 标识符 内置数据类型标识符 常量值标识符 空白标识符 关键字 程序整体结构的关键字…

VBA提高篇_05日期时间函数

文章目录日期函数1. Date()2. Time()3. Now()时间数据解析函数时间运算函数DateDiff() 数据时间差DateAdd() 时间点指定跨越拓展日期函数 VBA中默认日期系统格式: #1/26/2023 12:20:25 # #月/日/年 时:分:秒# 1. Date() 获取当前系统的时间(年/月/日) 精度: 精确到秒 范围: 公…

Tomcat-HTTP服务器介绍、安装与使用

文章目录一、概述二、下载安装三、介绍四、启动Tomcat一、概述 Tomcat,是一个 HTTP 服务器,就是在 TCP 服务器的基础上,加上了一些额外的功能。使用 HTTP 服务器的 API。就可以来提取HTTP请求的内容,也可以构造HTTP响应 二、下载…

【GPLT 二阶题目集】L2-015 互评成绩

学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输入格式&#xff…

HBase原理和设计

简介 HBase —— Hadoop Database的简称,Google BigTable的另一种开源实现方式,从问世之初,就为了解决用大量廉价的机器高速存取海量数据、实现数据分布式存储提供可靠的方案。从功能上来讲,HBase不折不扣是一个数据库&#xff0…

EcoStruxure Operator Terminal Expert 操作员终端专家

EcoStruxure Operator Terminal Expert(以前称为 Vijeo XD)是一款具有最新 UI 设计和手势的触摸屏配置软件,使您能够为 Magelis HMI 和 iPC 创建和编辑应用程序屏幕。 特点: 变量——内存中用于存储数据的命名空间。创建您需要的所…

MS-Model【3】:Medical Transformer

文章目录前言1. Abstract & Introduction1.1. Abstract1.2. Introduction2. Medical Transformer (MedT)2.1. Model structure2.2. Attention2.2.1. Self-Attention Overview2.2.2. Axial-Attention2.2.3. Gated Axial-Attention2.3. Local-Global Training2.4. Loss funct…

定位 position属性 相对定位 绝对定位 固定定位 定位下的居中 多个定位元素重叠时 补充

目录定位position属性相对定位绝对定位固定定位定位的做法: 定位下的居中多个定位元素重叠时补充定位 视觉格式化模型,大体上将页面中盒子的排列分为三种方式: 常规流浮动:float定位:position 定位:手动…

MySQL —— 数据类型

目录 一、数据类型的分类 二、数值类型 1. tinyint类型 2. bit类型 3. float类型 4. decimal类型 三、字符串类型 1. char类型 2. varchar类型 3. char和varchar的比较 四、时间日期类型 五、enum和set类型 一、数据类型的分类 分类数据类型说明数值类型BIT(M)位…

《深入浅出计算机组成原理》学习笔记 Day11

浮点数1. 浮点数的二进制转化2. 浮点数的加法和精度损失参考1. 浮点数的二进制转化 以 9.1109.1_{10}9.110​ 为例。910100129_{10} 1001_2910​10012​,再把小数位转换为二进制。以 0.100120.1001_20.10012​ 为例: 0.1001212−102−202−312−40.562…

吊打大厂:内核级安卓系统优化软件 | 雪豹速清app官网下载

雪豹速清app是当前非常热门的一款安卓系统垃圾清理优化工具,具有雪豹文件管理器、大文件查找、冗余文件/重复文件清理、安卓内核级垃圾清理、QQ微信专清、文件秒搜、M3U8视频合并、微信语音导出、伪装音视频查找、安装包提取等诸多特色实用功能,雪豹速清…

LCR TC1 测试仪

用于检测NPN PNP 晶体管 电阻 电容二极管 三极管 NMOS PMOS IGBT JFET 可控硅 红外波形 ,具有自校准功能。我手里的是TC-V2.12k 版本红外检测方法 :红外遥控器对准接收口,然后按下发送 即可检测 检测出 usercode 和datacode产品参数1.8寸屏幕…

Python内置包Tkinter的重要控件(上)

学习了这么久的Tkinter,基本上把Tkinter的重要控件都学了一遍,本文主要对其所有重要控件以及重要函数做一个总结,加深对Tkinter的理解与应用。 目录 前言 控件 1. Label 2. Button 3. Entry 4. Text 5. Menu 总结 前言 包括但不限…

MyBatis(一)MyBatis概述

一、什么是框架 ● 在文献中看到的framework被翻译为框架 ● java常用的框架: SSM三大框架:SpingSpringMVCMyBatisSpringBootSpringCloud● 框架其实就是对通用代码的封装,提前写好了一堆接口和类,我们可以在做项目的时候直接引…