Makefile教程(Makefile的结构)

news2024/11/17 1:44:36

文章目录

  • 前言
  • 一、Makefile的结构
  • 二、深入案例
  • 三、Makefile中的一些技巧
  • 总结


前言

一、Makefile的结构

Makefile 通常由一系列规则组成,每条规则定义了如何从源文件生成目标文件。每个规则又由目标、依赖和命令三部分组成。

下面是 Makefile 规则的基本结构:

target: dependencies
    command1
    command2
    ...

其中,target 是要生成的目标文件名,dependencies 是生成目标文件所依赖的文件或目录,而 command1、command2 等则是生成目标文件所需执行的命令。

例如,以下的规则:

hello: hello.c
    gcc -o hello hello.c

指定了一个规则,用于将 hello.c 编译成可执行文件 hello。其中,hello 是目标文件名,hello.c 是依赖的源文件名,而 gcc 则是生成目标文件所需要的命令。注意,在命令行中,我们需要使用 tab 而非空格来缩进命令行。

首先我们先编写一个hello.c:

#include <stdio.h>

int main(void)
{
    printf("Hello World\n");

    return 0;
}

执行make命令:
在这里插入图片描述
ls查看生成的文件:
这里可以看到生成了一个hello可执行文件。
在这里插入图片描述
执行hello可执行文件:
在这里插入图片描述

二、深入案例

这个 Makefile 有一个 all 目标,依赖于 test1 目标。all 目标包含一行命令 echo hello world,用于输出字符串 “hello world”。test1 目标没有依赖关系,包含一行命令 echo test1,用于输出字符串 “test1”。

当我们执行 make 命令时,make 会首先查找 Makefile 文件,并读取 all 目标。因为 all 目标依赖于 test1 目标,因此 make 会接着查找 test1 目标,并执行其命令。在 test1 的命令执行完成后,make 会回到 all 目标,并执行其命令,即输出字符串 “hello world”。

all : test1
	echo hello world

test1 : 
	echo test1

因此,make 命令的输出结果如下:
在这里插入图片描述

三、Makefile中的一些技巧

在命令前面加上@可以不显示出执行的命令:

all : test1
	@echo hello world

test1 : 
	@echo test1

执行结果;
这里我们可以看到执行make后没有显示出执行的命令。
在这里插入图片描述

将all和最终可执行文件名放在makefile的第一个目标里面:

hello all : hello.o func.o
	gcc -o hello hello.o func.o

hello.o : hello.c
	gcc -c -o hello.o hello.c

func.o : func.c
	gcc -c -o func.o func.c

对应文件代码:
hello.c:


extern void func(void);

int main(void)
{
    func();

    return 0;
}

func.c:

#include <stdio.h>

void func(void)
{
    printf("Hello World\n");
}

执行make命令:
在这里插入图片描述
再次执行make命令:
在这里插入图片描述
我们发现这里执行第二次make命令的时候会告诉我们hello已经是最新的了,那么就不会再次进行编译执行了。

在执行Make命令时,Make会根据规则的依赖关系判断哪些规则需要重新执行以及哪些规则可以跳过。

如果Make发现生成目标的依赖文件没有更新,那么就没有必要重新生成目标文件。因此,Make会跳过这条规则,并且不执行规则中的命令。只有当目标依赖关系中的某个文件发生了变化,才会导致相关规则和命令的重新执行。

这种依赖关系可以有效地提高Make的构建效率,避免不必要的重复构建。当你修改了源代码文件时,Make会自动检测出需要重新构建的目标,并生成最新的可执行文件或静态库。

那么加上all又可以起到什么作用呢:

使用make all命令:
在这里插入图片描述
当执行make all时make程序会自动寻找到makefile中的all目标进行执行。

总结

本篇文章主要讲解了makefile的结构和一些小技巧,希望大家能够好好理解并掌握。

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

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

相关文章

Matlab官方的两个配色colormap补充包

目录 一、othercolor 1、使用方法 2、图示 二、slanCM 1、使用方法 2、图示 三、从matlab上下的函数如何使用 一、othercolor 下载地址&#xff1a;matlab_othercolor.zip 1、使用方法 不指定获取颜色个数会默认256色&#xff0c;举例获取[163]号彩虹色(rainbow)&…

Java阶段二Day15

Java阶段二Day15 文章目录 Java阶段二Day15复习前日知识点对象数据类型注入数组类型注入集合类型的注入p命名空间引入外部属性文件 基于XML管理beanbean的作用域bean的生命周期代码演示生命周期后置处理器处理展示基于XML的自动装配 基于注解管理bean开启组件扫描使用注解定义B…

【A200】 TX1核心 JetPack4.6.2版本如何修改DTB文件测试全部SPI

大家好&#xff0c;我是虎哥&#xff0c;很长时间没有发布新内容&#xff0c;主要是这段时间集中精力&#xff0c;研究DTB设备树的修改&#xff0c;以适配不同载板&#xff0c;同时也是专门做了一个TX1&TX2核心&#xff0c;双网口&#xff0c;可以使用SPI 扩展CAN接口的载板…

java获取resources路径的方法

我们在写程序的时候&#xff0c;有时候会发现代码不能正常运行&#xff0c;出现提示异常的问题&#xff0c;这就说明我们的代码没有执行完&#xff0c;也就是没有 resource&#xff0c;其实遇到这种情况&#xff0c;我们只需要把代码重新执行一遍即可。 在 java中是可以实现 re…

【计算机组成原理笔记】计算机的基本组成

计算机的基本组成 文章目录 计算机的基本组成冯诺伊曼计算机的特点硬件框图以运算器为核心的计算机现代计算机系统复杂性管理的方法 计算机的工作步骤存储器运算器控制器I/0 脚注 冯诺伊曼计算机的特点 五大部件组成 运算器存储器控制器输入设备输出设备 指令和地址以同等地位…

基于CUDA的GPU计算PI值

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 基于CUDA的GPU计算PI值。本项目使用CUDA编程模型并行计算PI值&#xff0c;研究GPU与CPU效率的比较&#xff0c;分析不同GPU线程分块对性能的影响。 异构计算试验报告 —实验1&#xff1a;基于CUDA的GPU计算PI值 第一部分&…

原型模式--深拷贝和浅拷贝

定义 Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. &#xff08;使用原型实例指定将要创建的对象类型&#xff0c;通过复制这个实例创建新的对象。&#xff09; 从定义中我们我们可以发现&#x…

2023年4月Web3行业月度发展报告区块链篇 | 陀螺科技会员专享

4月&#xff0c;以太坊上海升级与香港Web3动向成最大热点&#xff0c;上海升级的完成是转POS的重要里程碑&#xff0c;从市场而言&#xff0c;由于升级解锁质押ETH是否引发抛压备受关注&#xff0c;仅以交易表现来看&#xff0c;并未出现大范围的抛压与离场。另一方面&#xff…

算力提升+AIGC,是驱动元宇宙发展的核心引擎|数据猿直播干货分享

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 “元宇宙”是美国科幻小说家尼奥斯蒂文森1992年在《雪崩》中提出的概念&#xff0c;书中设定现实世界中的人在网络世界中都有一个分身&#xff0c;这个由分身组成的世界就是“元宇宙”。如今&#xff0c;随着虚拟现实技术的…

60+开箱即用的工具函数库xijs更新指南(v1.2.5)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用函数逻辑问题, 帮助开发者更高效的开展业务开发. 接下来就和大家一起分享一下v1.2.5 版本的更新内容以及后续的更新方向. 贡献者列表: 1. 数据深拷贝cloneDeep 该模块主要由 20savage 贡献, 支持 symbol, map,…

BM58-字符串的排列

题目 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数据范围&#xff1a;n < 10。 要求&#xff1a;空…

[架构之路-191]-《软考-系统分析师》-8-软件工程 - 解答什么是面向功能的结构化程序设计:算法+数据结构 = 程序

目录 1. 什么是结构化程序设计 2. 结构化程序设计的局限性 3.程序设计的三种基本结构 (1) 顺序结构 (2) 选择结构 (3) 循环结构 1. 什么是结构化程序设计 功能 》 Function 》 函数 》 算法 数据流Data Flow 》 数据结构Data Strucuture 程序 算法 数据结构 》 数…

36. Kubernetes 网络原理——CNI 网络插件

本章讲解知识点 Flannel 原理概述直接路由的原理和部署示例Calico 插件原理概述1. Flannel 原理概述 Flannel 是一个用于容器网络的开源解决方案,它使用了虚拟网络接口技术(如 VXLAN)和 etcd 存储来提供网络服务。它的原理概述如下: Flannel 协助 Kubernetes,给每一个 No…

界面交互篇:答题页的答题逻辑交互开发

微信小程序云开发实战-答题积分赛小程序 界面交互篇:答题页的答题逻辑交互开发 前面的那一篇文章,我们已经完成了使用云开发的聚合能力实现从题库中随机抽取题目功能。 在页面加载时,实现从题库中随机抽取题目功能。那么,拿到数据后要干什么?如何做? 动态数据绑定 实…

c++练习题

1、默认参数练习 创建默认参数函数 void stars(int cols ,int rows ) 该函数默认缺省值cols是10 rows是1。该函数完成功能是根据行和列数显示一个由星号组成的矩形。在main函数仲按照默认值调用该函数。按照cols是5调用该函数。按照列数和行数是7&#xff0c;3 调用该函数 #…

【MMdetection训练及使用脚本系列】MMdetection训练1——如何保存最优的checkpoint文件

MMdetection如何保存最优的checkpoint文件 以目标检测为例&#xff0c;进入到 configs/_base_/datasets/coco_detection.py将evaluation dict(interval1, metricbbox)改为evaluation dict(interval1, metricbbox, save_bestauto)即可。 但是不建议这样做&#xff0c;防止以…

软件设计师笔记--数据结构

文章目录 前言学习资料数据结构大 O 表示法时间复杂度线性结构和线性表线性表的顺序存储线性表的链式存储栈的顺序存储栈的链式存储队列的顺序存储与循环队列 串KMP 数组矩阵树二叉树二叉树的顺序存储结构二叉树的链式存储结构二叉树的遍历平衡二叉树二叉排序树最优二叉树(哈夫…

C/C++每日一练(20230507) 数列第n项值I/II、简化路径

目录 1. 求数列的第n项的值 ※ 2. 求数列的第n项的值 II ※ 3. 简化路径 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 求数列的第n项的值 已知数列…

摘要:PostgreSQL开发技术基础:过程与函数

原文地址 6.0 Language SQL与PL/pgSQL PL / PgSQL是基于SQL的特定于PostgreSQL的过程语言 。它有循环&#xff0c;variables&#xff0c;错误/exception处理等等。并不是所有的SQL都是有效的PL / PgSQL&#xff0c;正如你发现的那样&#xff0c;例如&#xff0c;你不能在没有…

Nature:时松海课题组揭示调控大脑新皮层神经元空间精细结构排布和环路组装的新机制

2022年12月7日&#xff0c;清华大学生命科学学院、清华-IDG/麦戈文脑科学研究院、生命科学联合中心、生物结构前沿研究中心时松海教授课题组在Nature杂志以长文的形式在线发表了题为“Patterned cPCDH expression regulates the fine organization of the neocortex”&#xff…