Makefile 基础与常用语法详解

news2024/9/28 8:21:34

6889d63637ca4456a60f7f37c0ff5b1d.png

目录

 

一、引言

二、Makefile 基础概念

1.目标、依赖和命令

2.文件名和搜索路径

3.执行顺序和依赖关系

三、Makefile 常用语法

1.变量和宏定义

2.自动变量

3.模式规则 

4.条件判断

5.循环

6.伪目标

 

四、Makefile 实际应用示例

五、总结


 

一、引言

        在软件开发过程中,项目的构建和管理是至关重要的环节。Makefile 作为一种强大的工具,能够自动化地完成项目的编译、链接和部署等任务,极大地提高了开发效率。本文将深入介绍 Makefile 的基础概念和常用语法,帮助读者更好地掌握这一工具。

 

二、Makefile 基础概念

1.目标、依赖和命令

Makefile 由目标(target)、依赖(dependency)和命令(command)组成。目标通常是一个文件或一个动作,依赖是生成目标所需要的文件或其他目标,命令是用于生成目标的具体操作。

例如:

myprogram: main.o func.o
    gcc main.o func.o -o myprogram

在这个例子中,myprogram是目标,main.ofunc.o是依赖,gcc main.o func.o -o myprogram是命令。这个规则表示如果main.ofunc.o文件发生了变化,就执行gcc命令来生成可执行文件myprogram

 

2.文件名和搜索路径

  • Makefile 通常以文件名 “Makefile” 或 “makefile” 命名。在执行make命令时,Make 工具会自动查找当前目录下的 Makefile 文件,并按照其中的规则进行构建。
  • 如果你的项目比较复杂,可以将 Makefile 拆分为多个文件,然后使用include指令将它们包含进来。Make 工具会按照指定的搜索路径查找被包含的 Makefile 文件。

 

3.执行顺序和依赖关系

  • Makefile 中的规则是按照依赖关系和目标的先后顺序执行的。如果一个目标的依赖发生了变化,Make 工具会自动重新执行生成该目标的命令。
  • 例如,如果main.c文件发生了变化,Make 工具会重新编译main.c生成main.o,然后再重新链接生成myprogram

 

三、Makefile 常用语法

1.变量和宏定义

  • Makefile 支持变量和宏定义,可以将常用的路径、文件名或命令等定义为变量,以便在不同的规则中重复使用。
  • 变量定义可以使用 “=”、“:=” 或 “define” 等方式。例如:
CC = gcc
CFLAGS = -Wall -g

myprogram: main.o func.o
    $(CC) $(CFLAGS) main.o func.o -o myprogram

在这个例子中,定义了两个变量CCCFLAGS,分别表示编译器和编译选项。在规则中使用$(CC)$(CFLAGS)来引用这些变量。

 

2.自动变量

Makefile 提供了一些自动变量,如$@表示目标文件名,$<表示第一个依赖文件名,$^表示所有依赖文件名。

例如:

myprogram: main.o func.o
    gcc $^ -o $@

在这个例子中,$@表示目标文件名myprogram$^表示所有依赖文件名main.o func.o

其它自动变量如下图所示:

a019e09bd4994ed280116c4794741360.png

 

3.模式规则 

模式规则是一种通用的规则,可以用于构建多个具有相似名称和依赖关系的目标。它使用模式符号(%)来表示目标和依赖中的可变部分。

例如,以下是一个简单的模式规则:

%.o: %.c
    gcc -c $< -o $@

这个规则表示,对于任何以.c结尾的文件,都可以使用gcc -c命令将其编译为对应的以.o结尾的目标文件。

模式符号(%)在目标和依赖中表示可变部分。在上面的例子中,%.o表示任何以.o结尾的目标文件,%.c表示对应的以.c结尾的源文件。

当 Make 工具解析模式规则时,它会将目标和依赖中的模式符号替换为具体的文件名,以确定要构建的目标和依赖关系。

 

4.条件判断

Makefile 支持条件判断,可以根据不同的条件执行不同的命令。条件判断可以使用ifeqifneqifdefifndef等指令。

例如:

ifeq ($(DEBUG),1)
    CFLAGS += -DDEBUG
endif

myprogram: main.o func.o
    gcc $(CFLAGS) main.o func.o -o myprogram

在这个例子中,如果定义了变量DEBUG并且其值为 “1”,则在编译选项中添加-DDEBUG宏定义。 

 

5.循环

Makefile 支持循环,可以对一系列的文件或变量进行操作。循环可以使用foreachfor等指令。

例如:

SRCS = main.c func.c
OBJS = $(foreach src,$(SRCS),$(src:.c=.o))

myprogram: $(OBJS)
    gcc $^ -o $@

在这个例子中,使用foreach指令将SRCS列表中的每个.c文件转换为.o文件,并将结果存储在OBJS变量中。

 

6.伪目标

伪目标不是一个真正的文件,而是一个动作的名称。可以使用.PHONY关键字来定义伪目标,以避免与同名的文件冲突。

例如:

.PHONY: clean all

clean:
    rm -f *.o myprogram

all: myprogram

在这个例子中,cleanall都是伪目标。执行make clean会删除所有的.o文件和可执行文件,执行make all会构建可执行文件。

 

四、Makefile 实际应用示例

假设我们有一个简单的 C 项目,包含main.cfunc.c两个文件。以下是一个 Makefile 的示例:

CC = gcc
CFLAGS = -Wall -g

myprogram: main.o func.o
    gcc main.o func.o -o myprogram

main.o: main.c
    gcc -c main.c

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

clean:
    rm -f *.o myprogram

在这个例子中,定义了一个可执行文件myprogram,它依赖于main.ofunc.o两个目标文件。分别为main.cfunc.c定义了编译规则,生成对应的.o文件。同时,定义了一个伪目标clean,用于删除生成的目标文件和可执行文件。

 

五、总结

        Makefile 是一个强大的工具,能够自动化地完成项目的构建和管理任务。通过掌握 Makefile 的基础概念和常用语法,你可以更加高效地进行软件开发。在实际应用中,可以根据项目的需求和特点,灵活地使用 Makefile 的各种功能,提高开发效率和代码质量。希望本文能够帮助读者更好地理解和使用 Makefile。

 

 

 

 

 

 

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

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

相关文章

断链保护器在矿山机械中的安全守护与效能提升应用探析

在严峻复杂的矿山作业环境下&#xff0c;断链保护器作为一项不可或缺的安全技术装备&#xff0c;扮演着守护生命财产安全、维护生产秩序的关键角色&#xff0c;特别是在确保矿山机械稳定高效运行方面&#xff0c;其价值和意义显得尤为重要。 一、强化安全基石&#xff0c;守护矿…

Project 2021图文安装教程及下载

Microsoft Project是一个国际上享有盛誉的通用的项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本的计划、控制。Microsoft Project 不仅可以快速、准确地创建项目计划&#xff0c;而且可以帮助项目经理…

2024年,还有不用这个技术的网站?

大家好&#xff0c;我是程序员鱼皮。 不知道大家有没有听说过 “服务端渲染” 这样一种技术&#xff1f;如今这个技术越来越流行&#xff0c;尤其对于以内容为核心的网站&#xff0c;使用服务端渲染可以大幅提升网站被搜索到的概率&#xff0c;所以很多企业级网站都用到了这个…

无人机之遥控器防水性能篇

无人机遥控器的防水性能是评估其耐用性和适应不同环境能力的重要指标。随着无人机技术的不断发展&#xff0c;越来越多的遥控器在设计时融入了防水元素&#xff0c;以满足用户在不同天气条件下的使用需求。以下是对无人机遥控器防水性能的详细探讨&#xff1a; 一、防水等级与…

安装部署harbor及docker-compose的 实例

部署harbor python --version yum -y install python2-pip # 查看版本信息 pip list # 更新pip pip install --upgrade pip pip install --upgrade pip20.3 -i https://mirrors.aliyun.com/pypi/simple # 安装docker-compose pip install docker-compose --…

Java并发编程(21)—— CurrentHashMap源码分析

java 并发包中提供的 CurrentHashMap是一个线程安全且高效的HashMap ,也是面试的高频考点。 下面将围绕主题:ConcurrentHashMap 如何实现高效地线程安全?以及在Java8中它从设计实现上有哪些演进? 这篇文章一开始我以为会比较简单,但是在深入源码分析时,遇到了很大的阻碍,…

一文彻底搞懂大模型 - 语言模型的发展历程

语言模型的发展历程 语言模型&#xff08;LM&#xff0c;Language Model&#xff09;的发展历程可以清晰地划分为三个主要阶段&#xff1a;统计语言模型、神经网络语言模型以及基于Transformer的大语言模型。每个阶段的模型都在前一个阶段的基础上进行了改进和优化&#xff0c…

[000-01-008].第02节:Consul在实际中应用

我的后端学习大纲 SpringCloud学习大纲 1.使用Consul后&#xff0c;服务架构设计&#xff1a; 2.实现把支付服务provider8001注册到consul中 2.1.改POM&#xff1a; <!--SpringCloud consul discovery --> <dependency><groupId>org.springframework.cloud&…

超详细超实用!!!java开发之接口开发链接数据库(五)

云风网 云风笔记 云风知识库 日常项目接口开发&#xff0c;基本都是通过数据库获取存储数据通过接口反馈给前端&#xff0c;所以我们需要给项目连接上数据库 一、项目安装依赖 1、MySQL数据库 MySQL是一个关系型数据库管理系统&#xff0c;一般优势就是免费开源、易用、稳定性…

Spring 事务 数据库连接获取和释放原理

##调试demo Service public class CrmUserService {Autowiredprivate CrmUserDao crmUserDao;Autowiredprivate CrmLoginLogDao crmLoginLogDao;Transactionalpublic void getUser() {System.out.println("Service::"Thread.currentThread().getName());System.out.…

趣味算法------单一背包问题(01背包问题)贪心算法解决

目录 ​编辑 前言 例题 题目描述 输入输出格式 解题思路 具体代码 C语言代码 python代码 总结 前言 单一背包问题&#xff08;0-1 Knapsack Problem&#xff09;是组合优化中的一个经典问题&#xff0c;它可以形式化为&#xff1a;给定一组物品&#xff0c;每个物品都…

微信小程序SSL证书

微信小程序开发投入项目使用就需要用到SSL证书&#xff0c;主要原因SSL证书是让服务器的数据采取加密协议传输&#xff0c;避免来自中间人劫持或数据泄漏&#xff0c;所以在小程序交互数据过程中起到了关键性的作用。 为考虑到多个手机版本的兼容性&#xff0c;所以微信小程序…

Linux提升篇-Linux虚拟网络介绍

一、Linux虚拟网络-网桥 和tap/tun、veth-pair 一样&#xff0c;Bridge 也是一种虚拟网络设备&#xff0c;所以具备虚拟网络设备的所有特性&#xff0c;比如可以配置 IP、MAC 等。 除此之外&#xff0c;Bridge 还是一个交换机&#xff0c;具有交换机所有的功能。 对于普通的网…

移远通信精彩亮相IOTE 2024:探究技术融合,展望智慧未来

8月28-30日&#xff0c;IOTE 2024 第二十二届国际物联网展在深圳正式拉开帷幕&#xff0c;此次活动汇聚全球800家参展企业、10万来自工业、物流、基础建设、智慧城市、智慧零售领域的集成商、终端用户参观展会。 延续着2023年的辉煌成果&#xff0c;在2024 IOTE展上&#xff0c…

Mamba介绍,和Transformer对比

本文根据“一文看懂Mamba&#xff0c;Transformer最强竞争者”&#xff08;机器之心 编辑&#xff1a;Panda&#xff09;一文修改&#xff0c;并补充了一些新的观点。 在深度学习领域的广阔天地中&#xff0c;随着技术的不断进步&#xff0c;对更高效、更强大模型架构的探索从未…

Anaconda和Pycharm超详细安装教程(2024版本)!pycharm配置anaconda运行环境!

目录 一、anaconda下载安装 二、pycharm配置anaconda环境 工欲善其事&#xff0c;必先利其器。 安装包、激活码&#xff08;pycharm、anaconda、python&#xff09;点击领取 一、anaconda下载安装 1. Anaconda介绍 Anaconda 是一个基于 Python 的数据处理和科学计算平台&…

Dell 服务器 PowerEdge T440 驱动器故障

目录 1.故障&#xff1a;Dell 服务器 PowerEdge T440 驱动器指示灯闪烁 2.解决方案 1.故障&#xff1a;Dell 服务器 PowerEdge T440 驱动器指示灯闪烁 2024年8月30日 Dell PowerEdgeT440 驱动器指示灯琥珀色闪烁 查看 RAID5 磁盘组属性 显示 Virtual Disk 0:RAID5 降级 De…

Yolov10(yolov8代码里兼容版本)推理代码解析,抛去nms,大道至简

一、模型的输出头 下载官方的yolov8代码库https://github.com/ultralytics/ultralytics 打开ultralytics/nn/modules/head.py&#xff0c;主要需要看一下模型的输出头是如何做训练和预测推理。 v10检测头继承与常规的检测头Detect&#xff0c;初始化里重构了一下分类的输出头…

pacs图像打不开怎么办 --日常工作总结

先强调一下,我不是专门做图像入库和图像归档,我负责的是临床这边的影像,下面是占在我的业务日常分析总结的哈,(不太专业,勿喷) 我们经常会遇到在打开某个检查的时候,出现黑框,日志定位wado服务取不到图 这种情况一般分为 (1) 工作站,工作组,路由,存储卷配置缺失 ---对应的wad…