2. Makefile之目标、依赖(附示例)

news2024/12/23 9:59:51

一、本节概要

本专栏所有内容围绕Makefile官方文档进行刨析,给出详细具体示例做辅助理解手撕Makefile官方手册
在这里插入图片描述

二、Makefile中的目标和依赖

在一个简单的Makefile中,每条规则通常由以下几个部分组成:

target ... : prerequisites ...
    recipe
    ...
    ...
  • 目标(target)通常是由程序生成的文件的名称,例如可执行文件或目标文件。目标也可以是要执行的操作的名称,比如 ‘clean’。
  • 先决条件(prerequisites)是用于创建目标的输入文件。目标通常依赖于多个文件,这些文件被视为先决条件。

在规则的最后,可以包含一个或多个命令行指令(recipe),用于生成目标文件。这些指令可以是任何Shell命令,用于描述如何从先决条件生成目标文件。

因此,Makefile中的规则描述了目标文件如何依赖于先决条件,并提供了生成目标文件的步骤(recipe)。当某个目标的先决条件发生变化时,Make工具会根据规则中定义的步骤重新生成该目标文件。

三、辅助理解示例

以下是一个简单的示例Makefile:

# 目标: main
# 先决条件: main.c utils.c
# 生成可执行文件 main
main: main.o utils.o
    gcc -o main main.o utils.o

# 目标: main.o
# 先决条件: main.c
# 生成目标文件 main.o
main.o: main.c
    gcc -c -o main.o main.c

# 目标: utils.o
# 先决条件: utils.c
# 生成目标文件 utils.o
utils.o: utils.c
    gcc -c -o utils.o utils.c

# 清理生成的目标文件和可执行文件
clean:
    rm -f main main.o utils.o

在这个示例中,有三个规则。第一个规则定义了目标为main,它的先决条件为main.outils.o。生成目标的步骤是通过gcc编译器将main.outils.o链接为可执行文件main

第二个规则定义了目标为main.o,它的先决条件是main.c。生成目标的步骤是通过gcc编译器将main.c编译为目标文件main.o

第三个规则定义了目标为utils.o,它的先决条件是utils.c。生成目标的步骤是通过gcc编译器将utils.c编译为目标文件utils.o

最后,还定义了一个名为clean的伪目标,用于删除生成的目标文件和可执行文件。通过执行make clean命令,可以调用rm命令删除mainmain.outils.o

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

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

相关文章

修改虚拟机ip为静态ip

在使用虚拟机的时候,默认情况下使用的DHCP协议分配的动态IP地址,使得每次打开虚拟机后当前的IP地址都可能会发生变化,这样不方便管理。为了能够给当前虚拟机设置一个静态IP地址,方便后期使用XShell等连接工具进行连接,…

C/C++内存分布

C/C内存管理 1.C/C内存分布2.C语言中动态内存管理方法2.1 malloc/calloc/realloc/free 3.C内容管理方法3.1new/delete操作内置类型3.2 new和delete操作自定义类型 4.operator new与operator delete函数5.new和delete的实现原理5.1内置类型5.2自定义类型 6定位new表达式&#xf…

Libtorch 在x86_64的Linux 上部署时的版本问题

1. ubuntu 上安装了cuda12.1 和cuda 12.2 ,但是NVCC 指向的是10.1,但是10.1 又没有安装, 所以版本很混乱 ./usr/bin/nvcc -> 10.1./usr/lib/nvidia-cuda-toolkit/bin/nvcc-> 10.1./usr/local/cuda-12.1/bin/nvcc -> 12.1./usr/local/cuda-12.2…

RT-Thread快速入门-线程管理

在 RT-Thread 中,最基本的调度单位是线程,其他 RTOS 也叫任务。如果学习过或者了解过 RTOS,任务这种叫法是最为熟知的。 本篇文章来学习一下 RT-Thread 线程方面的内容。对于初学者来说,转换一下思维,建立多任务&…

Docker部署Redis集群详解【主从复制 + 哨兵模式】

前言 注意:该文章不会讲解Redis集群搭建的原理,只讲述如何通过Docker容器快速部署搭建Redis主从 哨兵模式的集群 准备工作: 一台云服务器 or 本地虚拟机(CentOS和Ubuntu都可以)安装好Docker环境(Docker、…

ROS框架——发布者功能包和订阅者功能包进行bool类型数据结构的topic通讯

ROS框架——发布者功能包和订阅者功能包进行bool类型数据结构的topic通讯 code review! 文章目录 ROS框架——发布者功能包和订阅者功能包进行bool类型数据结构的topic通讯零.同时运行两个功能包一.发布者功能包1.1.文件结构1.2.bool\_publisher\_node.cpp1.3.CMakeLists.txt…

SpringBoot实战(二十一)集成 TLog 日志

目录 一、简介二、Maven依赖三、启动类集成四、测试1.服务简介2.服务A代码DemoController.javaDemoFeignClient.java 3.服务B代码4.测试结果 补充一:自定义日志标签模板补充二:SpanId的生成规则补充三:业务标签1.打印入参2.指定连接符3.打印常…

【深度学习-卷积神经网络CNN-基础】

文章目录 发展历史卷积神经网络的应用领域卷积的原理和作用卷积和传统的神经网络的区别 卷积网络的整体架构输入层卷积层池化层全连接层卷积和池化叠加多层卷积可以处理什么类型的数据卷积的超参数卷积最大的优势 卷积的细节卷积的原理卷积的参数卷积的次数步长 卷积核尺寸 边缘…

成为UI设计高手:如何规划和创建UI设计组件库!

今天给大家分享一篇关于组件化设计的总结,希望可以带给大家更多设计思考。 什么是组件化 组件化化是构成界面的最基础元素和重复出现控件的集合体,也就是常说的组件库。通过对基础元素和控件的规范命名与排列组合,最终形成一个可快速调用与便…

每日一题——地下迷宫(迷宫问题II)

迷宫问题(地下迷宫)——II 题目链接 前言: 这题是在昨天迷宫问题——I的基础上进行的变形,因此,如果昨天的题目没看或者对迷宫问题不怎么了解,建议先看看昨天的解析。 迷宫问题——I源代码: …

安装redis,适配阿里云服务器,Liunx安装redis

下载redis以及编译安装 下载redis文件 wget http://download.redis.io/releases/redis-6.0.8.tar.gz #下载redis压缩文件 tar xzf redis-6.0.8.tar.gz #解压缩 cd redis-6.0.8 make 查看是否安装了gcc编译输入gcc --version如果没有…

AtcoderABC236场

A - chukodaiA - chukodai 题目大意 题目要求交换字符串S中第a个字符和第b个字符的位置,并输出结果。 思路分析 借用临时变量t,进行记录交换。 时间复杂度 O(∣S∣) 输出交换后的字符串的时间复杂度为O(∣S∣),其中∣S∣表示字符串SS的…

autohotkey实战:窗口透明化

文章目录 实现方法代码讲解WinGet和WinSet 注 本文采用的是V1版本语法 实现方法 窗口透明不仅实用性强,关键是非常炫酷,如果用AHK实现一个实时调节窗口透明度的工具,那么就可以一边敲代码,一边透过半透明的IDE,愉快地…

vue 3.0 如何实现 文本框只能输入数字 避免文字和符号

<input v-model.number"form.payTime" :min"0" type"number" οninput"valuevalue.replace(/[^0-9.]/g,)" type"text" /> v-model 后面的.numer 一定要加上不然没效果 οninput"valuevalue.replace(/[^0-9.]/g…

Pdb蛋白质数据库网址!+30蛋白质数据库网站!

蛋白质数据库是指专门存储蛋白质相关信息的数据库。它们收集、整理和存储大量的蛋白质数据&#xff0c;包括蛋白质序列、结构、功能、互作关系、表达模式、疾病关联等信息。蛋白质数据库提供了对这些数据的检索、查询和分析功能&#xff0c;为科学研究人员、生物信息学家和药物…

为什么deferred probe将设备挂入延迟链表而不是将驱动挂入延迟链表

1. 代码流程(drivers/base/dd.c) 可以看到在probe失败的时候(驱动返回-EPROBE_DEFER)是把设备挂到deferred_probe_pending_list上面的。 这就带来了一个疑问: 我当前明明是驱动加载的过程(driver_attach()->bus_for_each_dev()), 为什么要将设备挂到pending list上面而不是…

Maven高级(继承与聚合+私服)

分模块设计和开发 为什么要分模块设计&#xff1f; 一个项目往往是分为好几个模块的 如果不同模块全写在一个项目里面 所有的程序员都要调用这有个项目就难以维护 比如我们之前设计的板块 就不太合理&#xff0c;现在我们把实体类和对应的工具类单独开出两个maven模块存储 然…

安装openai和简单使用

Anaconda的界面创建open ai环境&#xff0c;选择python10 控制台 #或者 conda info -e 注意不是anaconda命令开头 (base) C:\Users\su>conda env list # conda environments: # base * F:\anaconda3 openai F:\anaconda3\envs\opena…

TCP的拥塞控制、提高网络利用率的方法【TCP原理(笔记四)】

文章目录 拥塞控制慢启动 提高网络利用率的规范Nagle算法延迟确认应答捎带应答 拥塞控制 有了TCP的窗口控制&#xff0c;收发主机之间即使不再以一个数据段为单位发送确认应答&#xff0c;也能够连续发送大量数据包。然而&#xff0c;如果在通信刚开始时就发送大量数据&#x…

新能源汽车交流充电桩CP信号详解

随着新能源汽车的推广&#xff0c;交流充电桩迎来了巨大的市场需求&#xff0c;人们对车辆充电的便利性、安全性有着越来越高的要求。CP信号主要用于交流充电桩&#xff0c;充电桩和汽车之间只能通过CP信号进行通讯&#xff0c;判断、控制充电电流和状态。 汽车充电桩CP信号…