【makefile调用shell命令的两种方式差别】makefile:15: recipe for target ‘main.o‘ failed make: *** [main.o] Error 1

本文讲述了作者花费大量时间解决Makefile中shell函数调用问题的经历,重点在于理解shell函数的工作原理,即函数返回值是命令执行结果,make会处理换行符。解决的关键在于将`DIR:=`pwd`改为`DIR:=$(shell pwd)`。
摘要由CSDN通过智能技术生成

错误提示

在这里插入图片描述

解决历程

花了一晚上时间,一直以为是写错了哪里,一度怀疑人生,心态爆炸
上网找答案都是让安装make或者更新make的,但是更新了也没用
最后看到了shell命令的调用,把DIR:=`pwd` 改成DIR:=$(shell pwd)就OK了
唉,心累了。

原因

shell函数的描述

shell函数不同于除“wildcard”函数之外的其它函数。make可以使用它来和外部通信。
函数功能:函数“shell”所实现的功能和shell中的引用(``)相同。实现对命令的扩展。这就意味着需要一个shell 命令作为此函数的参数,函数的返回结果是此命令在shell中的执行结果。make仅仅对它的回返结果进行处理;make将函数返回结果中的所有换行符(“\n”)或者一对“\n\r”替换为单空格;并去掉末尾的回车符号(“\n”)或者“\n\r”。进行函数展开式时,它所调用的命令(它的参数)得到执行。除对它的引用出现在规则的命令行和递归变量的定义中以外,其它决大多数情况下,make是在读取解析Makefile时完成对函数shell的展开。
返回值:函数“shell”的参数(一个 shell 命令)在 shell 环境中的执行结果。
函数说明:函数本身的返回值是其参数的执行结果,没有进行任何处理。对结果的处理是由 make 进行的。当对函数的引用出现在规则的命令行中,命令行在执行时函数才被展开。展开时函数参数(shell 命令)的执行是在另外一个 shell进程中完成的,因此需要对出现在规则命令行的多级“shell”函数引用需要谨慎处理,否则会影响效率(每一级的“shell”函数的参数都会有各自的 shell
进程)
就是说,调用shell命令会将语句末尾换行符替换成空格,另一种直接引用的方式不会替换,末尾就是换行符,makefile中换行就是另一个语句了,所以读入的目录不全,导致make失败

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值