iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux下Makefile的编写与使用详解
  • 338
分享到

Linux下Makefile的编写与使用详解

Linux下Makefile编写介绍Linux系统Makefile使用介绍 2022-06-04 23:06:33 338人浏览 八月长安
摘要

目录MakefileMakefile文件命名和规则Makefile的工作原理Makefile变量Makefile函数Makefile clean规则Makefile 一个工程文件中的源文件可能有很多,并且不同的功能、模块

目录
  • Makefile
  • Makefile文件命名和规则
  • Makefile的工作原理
  • Makefile变量
  • Makefile函数
  • Makefile clean规则

Makefile

一个工程文件中的源文件可能有很多,并且不同的功能、模块等都放在不同的目录中,常规的编译已经不能高效化的处理这样的问题,而Makefile就是为解决这一问题而来。

Makefile一旦写好,只需一个make指令,即可完成Makefile文件中所编写的所有指令,从而编译整个工程文件,极大的提高了效率

make是一个命令工具,用来解释Makefile中的命令。

Makefile文件命名和规则

文件命名

采用makefile或Makefile都可。

Makefile规则

Makefile中的命令规则如下:

xxx(目标文件):xxx(依赖文件)
制表符)命令(shell命令)
其中,目标文件即最终要生成的文件(伪目标除外),依赖文件即生成目标文件所需的文件,命令即shell命令。

注意,命令前必须有一个tab缩进。

例如:


#Makefile
app: a.c b.c #目标:依赖
	GCc a.c b.c -o app #注意这行最开始的缩进

make以上这个Makefile后就会将目录下的a.cb.c编译为目标文件app

Makefile的工作原理

Makefile中的命令在执行前,会检查是否存在所需的依赖文件

如果存在:执行命令

如果不存在:向下检查其他规则,是否存在其他规则生成当前规则所需要的依赖,如果有,则执行该规则中的命令。

例如:


#Makefile
app: a.o b.o
	gcc a.o b.o -o app
a.o: a.c
	gcc -c a.c -o a.o
b.o: b.c
	gcc -c b.c -o b.o

在上方这个Makefile中,当执行到app规则时,会发现所需的依赖文件a.o与b.o都不存在于当前目录,所以会向下寻找是否有其他规则生成此文件,当寻找到a.o规则时,发现其是所需的文件,就执行gcc -c a.c -o a.o,b.o同理。

Makefile在执行规则中的命令时,会比较目标文件和依赖文件的修改时间
如果依赖文件晚于目标文件修改时间,即依赖文件在上一次生成目标后进行过修改,则会重新生成目标文件。
如果依赖文件早于目标文件修改时间,即依赖文件在上一次生成目标后没进行修改,则不会执行相应的命令。
例如,你对一个Makefile使用两次make,第二次会提示make:"app"已是最新

利用这个特性,在加上我们将依赖与目标分级生成,即上方第二个Makefile,这样当我们仅修改其中的a.c文件,再一次make只会执行a.o规则与app规则,b.o规则因为b.c未修改而不执行,这样可以大大减少资源浪费。

Makefile变量

以上虽然可以减少编译代码的重复量,但是如果一个工程中有1000个.c .h文件,我们编写一个Makefile就会浪费大量时 间。因此,我们要采用一些变量来提高效率。

变量的获取
我们使用 $(变量名) 来使用变量。

自定义变量
我们使用 变量名 = 变量值var = hello来自定义我们所需的变量。
例如上方第一个Makefile就可改写为:


#Makefile
rsc = a.c b.c
app: $(rsc) #目标:依赖
	gcc $(rsc) -o app #注意这行最开始的缩进

预定义的变量
有部分变量是系统预定义的,我们可以直接使用。
AR:归档维护程序的名称,默认值为ar
CC:C编译器的名称,默认值为cc
CXX:c++编译器的名称,默认值为g++
$@:目标的完整名称
$<:第一个依赖文件的名称
$^:所有依赖文件的名称

为了方便理解接下来的例子,我们简单讲解一下Makefile中的模式匹配。
%.o:%.c 中,%是 通配符,匹配一个字符串,而两个%则匹配同一个字符串
例如上方第二个Makefile可改写为:


#Makefile
rcs = a.o b.o
app: $(rcs)
	$(CC) $(rcs) -o $@
%.o: %.c #上方规则会执行两次此规则
	$(CC) -c $< -o $@

Makefile函数

我们可以看到,上面这个Makefile已经相对简单了,但是,还是没有解决工程中文件很多的情况,rcs的获取还是要我们输入每个需要编译的文件,那么,就要采用函数来替我们去写入这些依赖文件。

$(wildcard PATTERN. . .)
这个函数的功能是获取指定目录下指定类型的文件。
其中参数PATTERN是某个目录下某种类型的文件,多个目录多个类型可用空格分隔。
返回值是一个若干个文件的文件列表,文件名用空格隔开。

例如:

$(wildcard ./*.c) 返回当前目录下的所有以c为后缀的文件。

$(patsubst pattern, replacement, text)
这个函数的功能是查找text中的单词是否符合模式pattern,如果符合,则用replacement替换。
pattern可以包括通配符 % 。如果replacement中也包含 % ,那么replacement中的 % 将和 pattern中的 % 保持一致。
返回值为替换后的字符串。

例如:

$(patsubst %.c, %.o, a.c, b.c) 返回a.o, b.o。

这样,我们上面那个例子就可以改写为:


#Makefile
rcs = $(wildcard ./*.c)
objs = (patsubst %.c, %.o, $(src))
app: $(objs)
	$(CC) $(objs) -o $@
%.o: %.c #上方规则会执行两次此规则
	$(CC) -c $< -o $@

Makefile clean规则

在我们执行完make指令后,会发现当前目录下多出了很多以o为后缀的文件,但是我们仅需要最终的目标文件app,其他的都EsVYucV是多余的,我们该如何处理。clean规则就会帮助我们处理他们。

clean

我们只用将clean规则添加到Makefile的最后,即可在每次编译完成后执行clean规则中的命令。如:


#Makefile
rcs = $(wildcard ./*.c)
objs = (patsubst %.c, %.o, $(src))
app: $(objs)
	$(CC) $(objs) -o $@
%.o: %.c #上方规则会执行两次此规则
	$(CC) -c $< -o $@
clean:
	rm $(objs) -f #rm指令删除 -f迭代删除

但是你会发现当前目录下多出了一个clean目标文件,依旧会采用Makefile的策略,对比修改时间,导致我们时常及时执行了clean,还是无法清除文件,那么,我们就需要接下来这个操作。

我们将clean定义为伪目标,即 .PHONY:clean 那么它就不会生成目标文件,少了对比,那么每次都会执行。

例如:


#Makefile
rcs = $(wildcard ./*.c)
objs = (patsubst %.c, %.o, $(src))
app: $(objs)
	$(CC) $(objs) -o $@
%.o: %.c #上方规则会执行两次此规则
	$(CC) -c $< -o $@
.PHONY: clean #伪目标
clean:
	rm $(objs) -f #rm指令删除 -f迭代删除

到此这篇关于linux下Makefile的编写与使用详解的文章就介绍到这了,更多相关Linux Makefile编写与使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

--结束END--

本文标题: Linux下Makefile的编写与使用详解

本文链接: https://www.lsjlt.com/news/21463.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux下的自动化构建工具之make/makefile的用法详解
    目录一、make和makefile的区别二、makefile的原理1、make的原理详解2、临时文件的清理3、文件的三个时间三、makefile的推导规则四、实现一个进度条1、缓冲区问题2、实现倒计时程序3、进度条的实现...
    99+
    2024-04-02
  • python下grpc与protobuf的编写使用示例
    目录1. python下protobuf使用1.1 安装protobuf1.2 protobuf3定义格式1.3 生成proto的python文件1.4 对比一下protobuf生成...
    99+
    2024-04-02
  • linux中的makefile怎么使用
    在Linux中,Makefile是一种用来自动化编译和链接程序的工具。它可以根据程序的依赖关系来自动判断需要重新编译的文件,并生成可...
    99+
    2023-08-23
    linux makefile
  • GoGenerate代替Makefile使用方法详解
    目录介绍MockeryGo Generate用法总结介绍 图灵完备性(Turing completeness)是通用计算机的一个属性,它表示一个程序可以写另一个程序。比如 go t...
    99+
    2022-12-15
    Go Generate代替Makefile Go Generate
  • golang构建工具Makefile使用详解
    目录正文正文 可能是因为编译太简单了,golang 并没有一个官方的构建工具(类似于 java 的 maven 和 gradle之类的),但是除了编译,我们可能还需要下载依赖,运行测...
    99+
    2024-04-02
  • linux下dd使用方法详解
    本篇内容介绍了“linux下dd使用方法详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 命令简介dd 的主要选项:指定数字的地方若以下列...
    99+
    2023-06-13
  • C语言在linux下编程详解
    目录文件操作总结文件操作 #include <sys/unistd.h> //含有close函数 #include <fcntl.h> //含有op...
    99+
    2024-04-02
  • Windows下NumPy库的安装与使用详解
    在数据科学和机器学习领域,NumPy是一个非常流行的Python库,它提供了一个强大的多维数组对象和各种计算功能。在Windows操作系统下安装和使用NumPy库也非常简单。本文将详细介绍Windows下NumPy库的安装和使用方法。 安...
    99+
    2023-06-27
    windows numpy leetcode
  • Linux下Rsync的介绍与使用
    本篇内容介绍了“Linux下Rsync的介绍与使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!0.Rsync的介绍rsync是Linux系...
    99+
    2023-06-05
  • CFile与CStdioFile的文件读写使用方法详解
    CFile//创建/打开文件CFile file;file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|C...
    99+
    2022-11-15
    CFile CStdioFile
  • 如何在Linux环境下使用Go语言编写高效的API?
    在Linux环境下使用Go语言编写高效的API是一项非常重要的技能,因为Go语言以其高效、简洁、并发的特点成为了Web开发中的重要语言之一。在这篇文章中,我们将会介绍如何在Linux环境下使用Go语言编写高效的API。 一、安装Go语言环境...
    99+
    2023-07-08
    linux api shell
  • 如何使用GO语言在Windows和Linux下编写高效的API?
    Go语言是一种简单、高效、安全和开源的编程语言,它已经成为了云计算和Web开发领域的一种主流语言。Go语言的高效性和多平台支持特性,使得它成为了一种非常适合编写API(Application Programming Interface)的...
    99+
    2023-10-26
    linux windows api
  • golang下grpc框架的使用编写示例
    目录1. 什么是grpc和protobuf1.1 grpc1.2 protobuf2.go下grpc2.1官网下载protobuf工具2.2 下载go的依赖包2.3 编写proto文...
    99+
    2024-04-02
  • MySQL Workbench下载与使用教程详解
    一、MySQL Workbench的下载 Workbench是MySql图形化的管理工具,可以在Workbench里输入MySql的语句,这可能更适合大多数人的视觉,有些操作更能更简单化 首先我们下载wor...
    99+
    2024-04-02
  • Linux 使用vi文本编辑器详解
    目录 前言一.vi文本编辑器1.使用vi文本编辑器2.vi编辑器的工作模式3.命令模式中的基本操作(1)模式切换(2)移动光标(3)复制、粘贴和删除(4)查找文件内容(5)撤销编辑及保存和退出4.末行模式中的基...
    99+
    2023-03-06
    Linux 使用vi文本编辑器 linux操作系统vi文本编辑器 linux的vi编辑器命令
  • Linux 使用vi文本编辑器详解
    目录 前言一.vi文本编辑器1.使用vi文本编辑器2.vi编辑器的工作模式3.命令模式中的基本操作(1)模式切换(2)移动光标(3)复制、粘贴和删除(4)查找文件内容(5)...
    99+
    2023-03-06
    Linux 使用vi文本编辑器 linux操作系统vi文本编辑器 linux的vi编辑器命令
  • go使用makefile脚本编译应用的方法小结
    1. go介绍 Go官方 提供一个名为go的命令,该命令可以用来下载go的依赖,构建安装go应用,运行和测试 Go程序等等, 我们比较常用的比如go get, go mod, go ...
    99+
    2024-04-02
  • linux shell 编程之函数使用详解
    目录前言shell 函数分类系统函数1、basename语法简单案例2、dirname语法简单案例自定义函数语法语法说明注意点案例1:无参无返回值函数案例2:无参有返回值函数案例3:有参函数案例介绍补充:Shell程序与...
    99+
    2024-04-02
  • linux shell 编程之函数使用详解
    目录前言shell 函数分类系统函数1、basename语法简单案例2、dirname语法简单案例自定义函数语法语法说明注意点案例1:无参无返回值函数案例2:无参有返回值函数案例3:...
    99+
    2022-11-13
    linux shell 函数使用 linux shell 函数
  • 你知道如何在Linux下使用Python编写Bash脚本吗?
    Linux和Python都是开源且广泛应用的工具。在Linux中,Bash脚本是非常常用的一种编程语言,而Python是一种强大的编程语言,其在数据科学,人工智能,Web开发等领域都有广泛的应用。那么本文将会介绍这个问题。 一、Bash脚本...
    99+
    2023-11-05
    linux 响应 bash
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作