iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Makefile及其工作原理是什么
  • 229
分享到

Makefile及其工作原理是什么

2023-06-28 15:06:07 229人浏览 泡泡鱼
摘要

这篇文章给大家介绍Makefile及其工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当你需要在一些源文件改变后运行或更新一个任务时,通常会用到 make 工具。make 工具

这篇文章给大家介绍Makefile及其工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

当你需要在一些源文件改变后运行或更新一个任务时,通常会用到 make 工具。make 工具需要读取一个 Makefile(或 makefile)文件,在该文件中定义了一系列需要执行的任务。你可以使用 make 来将源代码编译为可执行程序。大部分开源项目会使用 make 来实现最终的二进制文件的编译,然后使用 make install 命令来执行安装。

依然从打印 “Hello World” 开始。首先创建一个名字为 myproject 的目录,目录下新建 Makefile 文件,文件内容为:

  1. say_hello:

  2. echo"Hello World"

在 myproject 目录下执行 make,会有如下输出:

  1. $ make

  2. echo"Hello World"

  3. HelloWorld

在上面的例子中,“say_hello” 类似于其他编程语言中的函数名。这被称之为目标target。在该目标之后的是预置条件或依赖。为了简单起见,我们在这个示例中没有定义预置条件。echo ‘Hello World' 命令被称为步骤recipe。这些步骤基于预置条件来实现目标。目标、预置条件和步骤共同构成一个规则。

总结一下,一个典型的规则的语法为:

  1. 目标:预置条件

  2. 步骤

作为示例,目标可以是一个基于预置条件(源代码)的二进制文件。另一方面,预置条件也可以是依赖其他预置条件的目标。

  1. final_target: sub_target final_target.c

  2. Recipe_to_create_final_target

  3. sub_target: sub_target.c

  4. Recipe_to_create_sub_target

目标并不要求是一个文件,也可以只是步骤的名字,就如我们的例子中一样。我们称之为“伪目标”。

再回到上面的示例中,当 make 被执行时,整条指令 echo "Hello World" 都被显示出来,之后才是真正的执行结果。如果不希望指令本身被打印处理,需要在 echo 前添加 @。 say_hello:    @echo "Hello World"

重新运行 make,将会只有如下输出:

  1. $ make

  2. HelloWorld

接下来在 Makefile 中添加如下伪目标:generate 和 clean:

  1. say_hello:

  2. @echo"Hello World"

  3. generate:

  4. @echo"Creating empty text files..."

  5. touchfile-{1..10}.txt

  6. clean:

  7. @echo"Cleaning up..."

  8. rm*.txt

随后当我们运行 make 时,只有 say_hello 这个目标被执行。这是因为Makefile 中的第一个目标为默认目标。通常情况下会调用默认目标,这就是你在大多数项目中看到 all 作为第一个目标而出现。all 负责来调用它他的目标。我们可以通过 .DEFAULT_GoAL 这个特殊的伪目标来覆盖掉默认的行为。

在 Makefile 文件开头增加 .DEFAULT_GOAL:

  1. .DEFAULT_GOAL := generate

make 会将 generate 作为默认目标:

  1. $ make

  2. Creatingempty text files...

  3. touchfile-{1..10}.txt

顾名思义,.DEFAULT_GOAL 伪目标仅能定义一个目标。这就是为什么很多 Makefile 会包括 all 这个目标,这样可以调用多个目标。

下面删除掉 .DEFAULT_GOAL,增加 all 目标:

  1. all: say_hello generate

  2. say_hello:

  3. @echo"Hello World"

  4. generate:

  5. @echo"Creating empty text files..."

  6. touchfile-{1..10}.txt

  7. clean:

  8. @echo"Cleaning up..."

  9. rm*.txt

运行之前,我们再增加一些特殊的伪目标。.PHONY 用来定义这些不是文件的目标。make 会默认调用这些伪目标下的步骤,而不去检查文件名是否存在或最后修改日期。完整的 Makefile 如下:

  1. .PHONY: all say_hello generate clean

  2. all: say_hello generate

  3. say_hello:

  4. @echo"Hello World"

  5. generate:

  6. @echo"Creating empty text files..."

  7. touchfile-{1..10}.txt

  8. clean:

  9. @echo"Cleaning up..."

  10. rm*.txt

make 命令会调用 say_hello 和 generate:

  1. $ make

  2. HelloWorld

  3. Creatingempty text files...

  4. touchfile-{1..10}.txt

clean 不应该被放入 all 中,或者被放入第一个目标中。clean 应当在需要清理时手动调用,调用方法为 make clean。

  1. $ make clean

  2. Cleaning up...

  3. rm*.txt

现在你应该已经对 Makefile 有了基础的了解,接下来我们看一些进阶的示例。

进阶示例
变量

在之前的实例中,大部分目标和预置条件是已经固定了的,但在实际项目中,它们通常用变量和模式来代替。

定义变量最简单的方式是使用 = 操作符。例如,将命令 GCc 赋值给变量 CC:

  1. CC =gcc

这被称为递归扩展变量,用于如下所示的规则中:

  1. hello: hello.c

  2. ${CC} hello.c -o hello

你可能已经想到了,这些步骤将会在传递给终端时展开为:

  1. gcc hello.c -o hello

${CC} 和 $(CC) 都能对 gcc 进行引用。但如果一个变量尝试将它本身赋值给自己,将会造成死循环。让我们验证一下:

  1. CC =gcc

  2. CC = ${CC}

  3. all:

  4. @echo ${CC}

此时运行 make 会导致:

  1. $ make

  2. Makefile:8:***Recursive variable 'CC' references itself (eventually). Stop.

为了避免这种情况发生,可以使用 := 操作符(这被称为简单扩展变量)。以下代码不会造成上述问题:

  1. CC :=gcc

  2. CC := ${CC}

  3. all:

  4. @echo ${CC}

模式和函数

下面的 Makefile 使用了变量、模式和函数来实现所有 C 代码的编译。我们来逐行分析下:

  1. #Usage:

  2. #make     # compile all binary

  3. #make clean  # remove ALL binaries and objects

  4. .PHONY = all clean

  5. CC =gcc            # compiler to use

  6. LINKERFLAG =-lm

  7. SRCS := $(wildcard *.c)

  8. BINS := $(SRCS:%.c=%)

  9. all: ${BINS}

  10. %:%.o

  11. @echo"Checking.."

  12. ${CC} ${LINKERFLAG} $

  13. %.o:%.c

  14. @echo"Creating object.."

  15. ${CC}-c $

  16. clean:

  17. @echo"Cleaning up..."

  18. rm-rvf *.o ${BINS}

  • 以 # 开头的行是评论。

  • .PHONY = all clean 行定义了 all 和 clean 两个伪目标。

  • 变量 LINKERFLAG 定义了在步骤中 gcc 命令需要用到的参数。

  • SRCS := $(wildcard *.c):$(wildcard pattern) 是与文件名相关的一个函数。在本示例中,所有 “.c”后缀的文件会被存入 SRCS 变量。

  • BINS := $(SRCS:%.c=%):这被称为替代引用。本例中,如果 SRCS 的值为 'foo.c bar.c',则 BINS的值为 'foo bar'。

  • all: ${BINS} 行:伪目标 all 调用 ${BINS} 变量中的所有值作为子目标。

  • 规则:

    下面通过一个示例来理解这条规则。假定 foo 是变量 ${BINS} 中的一个值。% 会匹配到 foo(%匹配任意一个目标)。下面是规则展开后的内容:

    如上所示,% 被 foo 替换掉了。$ 被 foo.o 替换掉。$用于匹配预置条件,$@ 匹配目标。对 ${BINS} 中的每个值,这条规则都会被调用一遍。

    1. foo: foo.o

    2. @echo"Checking.."

    3. gcc-lm foo.o -o foo

    1. %:%.o

    2. @echo"Checking.."

    3. ${CC} ${LINKERFLAG} $

  • 规则:

    之前规则中的每个预置条件在这条规则中都会都被作为一个目标。下面是展开后的内容:

    1. foo.o: foo.c

    2. @echo"Creating object.."

    3. gcc-c foo.c

    1. %.o:%.c

    2. @echo"Creating object.."

    3. ${CC}-c $

  • 最后,在 clean 目标中,所有的二进制文件和编译文件将被删除。

下面是重写后的 Makefile,该文件应该被放置在一个有 foo.c 文件的目录下:

  1. #Usage:

  2. #make     # compile all binary

  3. #make clean  # remove ALL binaries and objects

  4. .PHONY = all clean

  5. CC =gcc            # compiler to use

  6. LINKERFLAG =-lm

  7. SRCS := foo.c

  8. BINS := foo

  9. all: foo

  10. foo: foo.o

  11. @echo"Checking.."

  12. gcc-lm foo.o -o foo

  13. foo.o: foo.c

  14. @echo"Creating object.."

  15. gcc-c foo.c

  16. clean:

  17. @echo"Cleaning up..."

  18. rm-rvf foo.o foo

关于Makefile及其工作原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Makefile及其工作原理是什么

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

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

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

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

下载Word文档
猜你喜欢
  • Makefile及其工作原理是什么
    这篇文章给大家介绍Makefile及其工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当你需要在一些源文件改变后运行或更新一个任务时,通常会用到 make 工具。make 工具...
    99+
    2023-06-28
  • 云主机服务器及其工作原理是什么
    云主机服务器及其工作原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 云主机服务器指的是互联网基础设施以及使用模式,一般是利用网络按照所需以及容易扩展的方式对...
    99+
    2023-06-07
  • 一文理解Redux及其工作原理
    目录一、是什么二、工作原理三、如何使用小结一、是什么 React是用于构建用户界面的,帮助我们解决渲染DOM的过程 而在整个应用中会存在很多个组件,每个组件的state是由自身进行管...
    99+
    2024-04-02
  • Ansible架构及工作原理是什么
    Ansible架构及工作原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Ansible 是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用 SSH ...
    99+
    2023-06-19
  • ThreadLocal工作原理及用法是什么
    今天就跟大家聊聊有关ThreadLocal工作原理及用法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ThreadLocal是什么ThreadLocal是线程Thread中属性...
    99+
    2023-06-22
  • mybatis工作原理及流程是什么
    MyBatis是一种持久层框架,它的工作原理及流程如下:1. 配置文件加载:MyBatis首先读取配置文件(通常是mybatis-c...
    99+
    2023-08-14
    mybatis
  • dnslog原理及工作流程是什么
    DNSlog是一种常用于渗透测试和恶意软件分析的技术,通过利用DNS协议的特性,实现收集和分析恶意软件的通信行为。DNSlog的工作...
    99+
    2023-09-25
    dnslog
  • Java内存的原型及工作原理是什么
    这篇文章给大家介绍Java内存的原型及工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。主要通过分析Java内存分配的栈、堆以以及常量池详细的讲解了其的工作原理。一、java虚拟机内存原型寄存器:我们在程序中...
    99+
    2023-06-17
  • ajax原理及其优点是什么
    本篇文章给大家分享的是有关ajax原理及其优点是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 在工作中用了...
    99+
    2024-04-02
  • Linux sed工具的使用及工作原理是什么
    本文小编为大家详细介绍“Linux sed工具的使用及工作原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux sed工具的使用及工作原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-02
  • ZooKeeper工作原理是什么
    这篇文章主要介绍ZooKeeper工作原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ZooKeeper 是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等,。Z...
    99+
    2023-06-27
  • Casbin工作原理是什么
    Casbin工作原理Casbin通过配置文件来对访问控制模型进行配置,将一个访问控制的模型划分为PERM 的一个文件,切换或升级项目的授权机制与修改配置一样简单,您可以通过组合可用的模型来定制您自己的访问控制模型。...
    99+
    2024-04-02
  • jdbc工作原理是什么
    JDBC(Java Database Connectivity)是Java程序与数据库进行交互的一种标准接口。它定义了一组用于访问和...
    99+
    2023-08-31
    jdbc
  • Pinia工作原理是什么
    本篇内容介绍了“Pinia工作原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是PiniaPinia是Vue 3的状态管理库,它...
    99+
    2023-07-05
  • Ajax工作原理是什么
    本篇内容主要讲解“Ajax工作原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ajax工作原理是什么”吧!1、ajax技术的背景 不可否认,ajax技术...
    99+
    2024-04-02
  • MyBatis工作原理是什么
    这篇文章主要为大家展示了“MyBatis工作原理是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MyBatis工作原理是什么”这篇文章吧。MyBatis 的...
    99+
    2024-04-02
  • DHCP工作原理是什么
    这篇文章给大家分享的是有关DHCP工作原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一个应用层协议...
    99+
    2023-06-28
  • SpringMVC工作原理是什么
    这篇“SpringMVC工作原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spr...
    99+
    2024-04-02
  • Oracle ASM的概念以及工作原理是什么
    这期内容当中小编将会给大家带来有关Oracle ASM的概念以及工作原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。      A...
    99+
    2024-04-02
  • Java NIO的的介绍及工作原理是什么
    这篇文章主要讲解了“Java NIO的的介绍及工作原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO的的介绍及工作原理是什么”吧!针对传统I/O 工作模式的不足,NIO...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作