C语言-Makefile

Makefile

  • 什么是make?
    • make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令
    • 这个命令存放在 /usr/bin/
  • 什么是 makefile?
    • makefile 是个文件,这个文件中描述了我们程序的编译规则
    • 咱们执行 make 命令的时候, make 命令会在当前目录下找 makefile 文件,根据 makefile 文件里的规则,编译程序。
  • 注意: Makefile 规则文件是,程序员根据自己的程序编写的编译规则
  • 采用 Makefile 的好处
    • 简化编译程序的时候输入的命令,编译的时候只需要敲 make 命令就可以了
    • 可以节省编译时间,提高编译效率

1. make概述

GNU make 是一种代码维护工具

② make 工具会 根据 makefile 文件定义的规则和步骤,完成整个软件项目的代码维护工作

一般用来简化编译工作,可以极大地提高软件开发的效率

④ windows 下一般由集成开发环境自动生成

⑤ linux 下需要由我们按照其语法自己编写

1.1 检查是否有 make命令

命令:检查版本

make --version

在这里插入图片描述

1.2 make 和 Makefile的区别

make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令
makefile 是个文件,这个文件中描述了项目资源的编译规则。

2. makefile

2.1 优点

  • 管理我们的源文件
  • 会检查每个源文件是否被修改 再次只会编译修改过的源文件(提高编译效率)

2.2 语法及使用

  • 语法:
[变量名 = 变量值]
[...]
目标1:依赖文件列表
<tab>编译命令1
<tab>编译命令2目标2:依赖文件列表
<tab>编译命令1
<tab>编译命令2目标3:依赖文件列表
<tab>编译命令1
<tab>编译命令2
...

解释:

1、目标:通常是要产生的文件名称,目标可以是可执行文件或其它 obj 文件,也可是一个动作的名称

2、依赖文件:是用来输入从而产生目标的文件一个目标通常有几个依赖文件(可以没有)

3、命令:make 执行的动作,一个规则可以含几个命令(可以没有)有多个命令时,每个命令占一行

例:

main:main.cgcc main.c -o main
clear:rm main

解释:其中 main 就是目标main.c 就是依赖文件gcc main.c -o main 就是命令

注意:

​ 当目标后面没有依赖文件,我们就将其称为假象目标

  • 使用:

在控制台输入 make 命令

注意:

  1. make 默认在工作目录中寻找名为 GNUmakefilemakefileMakefile 的文件作为 makefile 输入文件
  2. -f 可以指定以上名字以外的文件作为 makefile 输入文件
  3. 若使用 make 命令时没有指定目标,则 make 工具默认会实现 makefile 文件内的第一个目标,然后退出。

例:在控制台输入

1,输入make,默认执行makefile文件中第一个目标中命令
2,输入make 目标,执行makefile文件中指定的目标中的命令
3,当makefile的文件名不是GNUmakefile、makefile、Makefile时,可以输入make -f 文件名,指定makefile文件
  • 再次执行只会编译修改过的文件

各文件如下:

在这里插入图片描述

通过命令行运行多个文件:

在这里插入图片描述

步骤:

步骤1:编写makefile文件如下

main:main.o myutils.ogcc main.o myutils.o -o main
clear:rm main *.o

步骤2:执行make命令查看,如下

在这里插入图片描述

步骤3:修改main.c文件,在次执行make命令

在这里插入图片描述

2.3 变量

2.3.1 分类
  • 系统变量:
由系统提供的变量make工具会拷贝系统的环境变量并将其设置为 makefile 的变量,在 makefile中可直接读取或修改拷贝后的变量。
查看系统变量命令:env
修改或添加系统变量export 变量名=值注意export是导入的意思

注意:

  • 只是临时修改,当dos关闭后,将不在存在
  • 如:makefile编写如下
main:main.o myutils.ogcc main.o myutils.o -o main
clear:rm main *.o
myprint:echo ${PWD}
  • 自定义变量(重点)

    程序员在编写makefile文件中自定义的变量

  • 预定义变量(重点)

    make命令提供的变量

2.3.2 自定义变量

语法:

定义变量:变量名=变量值
引用变量:$(变量名)或${变量名}

注意:

1、makefile 的变量名:makefile 变量名可以以数字开头

2、变量是大小写敏感的

3、变量一般都在 makefile 的头部定义

4、变量几乎可在 makefile 的任何地方使用

例:

EXEc = main
OBJ = main.o utils.o
FLAGS = -Wall -g		
cc = gcc$(EXEc):$(OBJ)$(cc) $(OBJ) -o $(EXEc) $(-Wall -g)
main.o:main.c$(cc) -c main.c -o main.o
utils.o:utils.c$(cc) -c utils.c -o utils.o
clear:rm $(EXEc) *.o
  • 引用变量:定义的变量 在下面用 $()${} 替换
  • -Wall -g:忽略所有警告
2.3.3 预定义变量
makefile 中有许多预定义变量,这些变量具有特殊的含义,可在 makefile 中直接使用。$@ 目标名$< 依赖文件列表中的第一个文件$^ 依赖文件列表中除去重复文件的部分以下为了解AR 归档维护程序的程序名,默认值为 arARFLAGS 归档维护程序的选项AS 汇编程序的名称,默认值为 asASFLAGS 汇编程序的选项cc c 编译器的名称,默认值为 gcccFLAGS c 编译器的选项cPP c 预编译器的名称,默认值为$(cc) -EcPPFLAGS c 预编译的选项cXX c++编译器的名称,默认值为 g++cXXFLAGS c++编译器的选项

如:

EXEc = main
OBJ = main.o utils.o
FLAGS = -Wall -g
cc = gcc$(EXEc):$(OBJ)$(cc) $^ -o $@ $(-Wall -g)
#%:统配符
%.o:%.c$(cc) -c $< -o $@
clear:rm $(EXEc) *.o

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

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

相关文章

华为数通——路由冗余和备份

注&#xff1a;当一条路由的出接口down时&#xff0c;该路由会自动失效。 要求&#xff1a;数据优先走千兆链路。 R1 [ ]ip route-static 172.16.1.0 24 12.1.1.2 目的地址 掩码 下一条 [ ]ip route-static 172.16.1.0 24 21.1.1.2 preference 50 目的地址 …

OxLint 发布了,Eslint 何去何从?

由于最近的rust在前端领域的崛起&#xff0c;基于rust的前端生态链遭到rust底层重构&#xff0c;最近又爆出OxLint&#xff0c;是一款基于Rust的linter工具Oxlint在国外前端圈引起热烈讨论&#xff0c;很多大佬给出了高度评价&#xff1b;你或许不知道OxLint&#xff0c;相比ES…

MySQL 8.x temp空间不足问题

目录 一、系统环境 二、问题报错 三、问题回顾 四、解决问题 一、系统环境 系统Ubuntu20.04 数据库版本MySQL 8.0.21 二、问题报错 在MySQL上执行一个大的SQL查询报错Error writing file /tmp/MYfd142 (OS errno 28 - No space left on device) Exception in thread …

【深度学习】强化学习(六)基于值函数的学习方法

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数7、深度强化学习 二、基于值函数的学习方法 一、强化学习问题 强化学习的基本任务是通过智能体与环境的交互学习一个策略…

el-date-picker 选择一个或多个日期

el-date-picker可选择多个日期 type“dates” 加个s即可 <div><span>el-date-picker选择多个日期</span><el-date-pickertype"dates"v-model"dateList"placeholder"选择一个或多个日期"></el-date-picker></di…

MyBatis环境的搭建

1.创建 Maven 工程 打开idea新建一个项目File → Project Structure → Project&#xff0c;build system中选择maven &#xff08;1&#xff09;由于 IDEA 中集成了 Maven&#xff0c;所以我们就不需要下载了&#xff0c;直接使用 IDEA 默认的 Maven 进行项目构建。 &#…

【NSX-T】10. 搭建NSX-T环境 —— 使用 BGP 配置 Tier-0 网关

目录 10.1 创建上行链路网段10.2 创建 Tier-0 网关&#xff08;1&#xff09;设置 Interface 信息&#xff08;2&#xff09;设置 BGP添加 BGP 邻居 &#xff08;3&#xff09;设置 BGP 路由重分发设置路由重新分发 10.3 连接 Tier-0 和 Tier-1 网关10.4 使用网络拓扑验证 Tier…

VLAN间的通讯---三层交换

一.三层交换 1.概念 使用三层交换技术实现VLAN间通信 三层交换二层交换 三层转发 2.基于CEF的MLS CEF是一种基于拓补转发的模型 转发信息库&#xff08;FIB&#xff09;临接关系表 转发信息库&#xff08;FIB&#xff09;可以理解为路由表 邻接关系表可以理解为MAC地址表…

Facebook广告系统结构

Facebook广告系统是一个复杂的大型系统&#xff0c;由多个组件和子系统相互配合工作&#xff0c;实现了广告的投放、拍卖、个性化推荐和效果评估等功能。下面小编讲讲Facebook广告系统的结构。 1、广告管理界面 广告管理界面是广告主与Facebook进行交互的入口&#xff0c;广告…

猿人学19题(原比赛平台)

这道题给我搞得有点懵了&#xff0c;我现在还没发现他到底要考察什么&#xff0c;这边我直接协商我的sessionid请求是直接就成功的。&#x1f602; 依旧是分析请求方式&#xff0c;抓包到返回数据的位置 现在可以知道这些数据是ajax返回的&#xff0c;请求的参数是page&#x…

Spark RDD、DataFrame、DataSet比较

在Spark的学习当中&#xff0c;RDD、DataFrame、DataSet可以说都是需要着重理解的专业名词概念。尤其是在涉及到数据结构的部分&#xff0c;理解清楚这三者的共性与区别&#xff0c;非常有必要。 RDD&#xff0c;作为Spark的核心数据抽象&#xff0c;是Spark当中不可或缺的存在…

C语言写的 mini版的 http 服务器 , 很详细

文章目录 效果展示整体架构流程技术细节完整代码 效果展示 例如&#xff1a;htpp://192.168.23.140/home.html -> 正确的请求格式 home.html 这个资源是放在我们服务器里面的 , 并不是随便访问的资源,当然我们可以放很多的资源进去. 整体架构流程 整个实现的流…

无心剑英译朱自清《匆匆》

匆匆 Vanished in Haste 朱自清 By Zhu Ziqing 燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:现在又到了哪里呢? Sw…

如何使用Docker进行容器的备份和恢复

一 简介&#xff1a; 在使用Docker进行应用程序的容器化部署时&#xff0c;我们经常需要对容器进行备份和恢复操作。备份容器可以保证数据的安全性&#xff0c;而恢复操作可以帮助我们快速恢复出现问题的容器。本文将介绍如何使用Docker进行容器的备份和恢复&#xff0c;同时提…

Buck电源设计常见的一些问题(二)MOS管炸机问题

MOS管炸机问题 1.概述2.MOS管的相关参数3.过电压失效4.过电流失效5.静电放电和热失效1.概述 在我们做电源产品或者电机控制器时候,经常会坏MOS管。我相信90%以上的硬件工程师在职场生涯中都会遇到这类问题。然而这类问题也总是让人防不胜防。经常我们都会开玩笑的说,没烧过管…

【数据结构第 6 章 ④】- 用 C 语言实现图的深度优先搜索遍历和广度优先搜索遍历

目录 一、深度优先搜索 1.1 - 深度优先搜索遍历的过程 1.2 - 深度优先搜索遍历的算法实现 二、广度优先搜索 2.1 - 广度优先搜索遍历的过程 2.2 - 广度优先搜索遍历的算法实现 和树的遍历类似&#xff0c;图的遍历也是从图中某一顶点出发&#xff0c;按照某种方法对图中所…

壹基金瑞金东升社区儿童服务站上演“甜蜜冬日”亲子DIY蛋糕秀

12月9日上午&#xff0c;一场温情满溢的亲子DIY蛋糕活动&#xff0c;在壹基金瑞金东升社区儿童服务站拉开了帷幕&#xff0c;空气里有香甜的奶油味道&#xff0c;浓浓的温馨气息感染着在场的每一个人。 自己动手做的&#xff0c;才有意义&#xff0c;蛋糕DIY是一项很好的亲子活…

想做游戏开发,我应该会点啥?

在知乎上&#xff0c;经常能看到类似“如何入门游戏开发”这样的问题&#xff0c;这篇文章&#xff0c;我试着概括性的对游戏开发所需要的技能做一个总结&#xff0c;希望大家对游戏开发能有一个基本的认识~ 游戏开发基础要求高么&#xff1f; 和其他程序猿一样&#xff0c;要…

前后端交互—开发一个完整的服务器

代码下载 初始化 新建 apiServer 文件夹作为项目根目录&#xff0c;并在项目根目录中运行如下的命令&#xff0c;初始化包管理配置文件: npm init -y运行如下的命令&#xff0c;安装 express、cors: npm i express cors在项目根目录中新建 app.js 作为整个项目的入口文件&a…

12V升18V4A同步升压恒压WT3210

12V升18V4A同步升压恒压WT3210 WT3210 是一款高功率密度的全集成同步升压转换器&#xff0c;内部集成的功率MOSFET管导通电阻为上管8mΩ和下管15mΩ。可为便携式系统提供空间小尺寸 解决方案。WT3210具有 2.7V 至 20V 的宽输入电压范围&#xff0c;应用在单节或两节锂电池的便携…