首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Makefile中使用include语句时要特别注意避免陷入无限循环的死循环中

  • 25-03-05 06:00
  • 3966
  • 12665
blog.csdn.net

Makefile中的include语句是把被包含的文件的内容包含当前文件中,类似于C语言中的include关键词。

但是使用时要特别注意避免陷入无限循环的死循环中。

来看下面这个有问题的例子:

顶层目录有文件Makefile和文件Makefile.build,
文件Makefile的内容如下:

str1 := MyNameIsSuWenhao

TOPDIR := $(shell pwd)

all:
	make -C ./ -f $(TOPDIR)/Makefile.build
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

文件Makefile.build的内容如下:

include Makefile

# 打印str1的值
myprint:
	@echo "str1's value is: $(str1)"
  • 1
  • 2
  • 3
  • 4
  • 5

运行命令:make时,我本意是想打印出变量str1的内容,但是构建程序会一直循环输出下面两条信息:

make[484]: Entering directory '/home/book/mycode/makefile_test_01'
make -C ./ -f /home/book/mycode/makefile_test_01/Makefile.build
.....
  • 1
  • 2
  • 3

在这里插入图片描述

这是什么原因呢?
原因在于Makefile.build中的include命令会把Makefile中的所有内容包含进来,相当于Makefile.build的内容如下:

str1 := MyNameIsSuWenhao

TOPDIR := $(shell pwd)

all:
	make -C ./ -f $(TOPDIR)/Makefile.build

# 打印str1的值
myprint:
	@echo "str1's value is: $(str1)"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

我们看此时Makefile.build的第一个目标是all目标,所以Makefile.build会去执行这个all目标,这个all目标的命令部分为:make -C ./ -f $(TOPDIR)/Makefile.build,也就是说又去调用文件$(TOPDIR)/Makefile.build进行构建,而一旦调用文件$(TOPDIR)/Makefile.build,它就又会去调用文件$(TOPDIR)/Makefile.build,这样就陷入了一种无限循环中。

怎么解决这个问题呢?
这里我们是想让Makefile.build去执行目标myprint,我们引入Makefile文件是为了使用它里面定义的那些变量及其值,而不是让Makefile.build去执行目标all,解决的方法很简单也很巧妙,我们只需要在Makefile.build中位于include命令前定义一个内容为空的目标myprint即可,比如下面的代码:

myprint:

include Makefile

# 打印str1的值
myprint:
	@echo "str1's value is: $(str1)"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这个代码中,第一行就是我们想在Makefile.build中执行的目标myprint,根据Makefile的规则,Makefile会先解析内容,再执行,当它解析时,发现后面还有个同名的目标myprint,再根据Makefile的规则,当有同名目标时,后面的覆盖前面的,所以它会去执行后面的目标myprint,这样就跳过了因为include包含进来的all目标。
运行效果如下:
在这里插入图片描述

昊虹嵌入式技术交流群
QQ群名片
注:本文转载自blog.csdn.net的昊虹AI笔记的文章"https://blog.csdn.net/wenhao_ir/article/details/144586519"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top