make 找不到命令,但该命令在 shell 中有效

make 找不到命令,但该命令在 shell 中有效

我已经make安装了,我已经riscv32-unknown-linux-gnu安装了工具链。

我已添加riscv/bin到我的路径中。我可以在 shell 中成功执行任何工具链命令。例如riscv32-unknown-linux gnu-as ... hello.s -o boot.o作品。

当我运行时which riscv32-unknown-linux-gnu-as,终端上没有打印任何内容。

当我make在 makefile 的目录中运行时,我得到

riscv32-unknown-linux-gnu-as -march=rv32i -mabi=ilp32 hello.s -o hello.o
make: riscv32-unknown-linux-gnu-as: Command not found
Makefile:18: recipe for target 'hello.o' failed
make: *** [hello.o] Error 127

看来我的路径有问题?我不知道为什么 which 和 make 找不到它,但我可以很好地执行它。

** 编辑 **

〜/.profile

export PATH="~/riscv/bin:$PATH"

我唯一能想到的是路径很奇怪,这是在 WSL 上

答案1

当波浪号字符 ( ~) 在双引号内使用时,通常不会扩展到您的主目录。如果你查看你的$PATH值,你会发现它包含一个文字波形符,而不是您的主目录的完整路径(如果您没有在作业中双引号引用该值,它就会这样做)。

make用于执行 shell 命令的shell (/bin/sh可能是 shell dash)和您的which命令不会对 中的值执行额外的波浪号扩展步骤$PATH。这就是为什么makewhich都找不到您需要使用的命令的原因。

bash另一方面,shell 在检查 时会执行额外的波浪号扩展步骤,$PATH因此这就是您可以在命令行上使用该命令的原因。

在这种情况下,这是bash奇怪的,因为实用程序在使用变量时不需要扩展波浪号$PATH

解决方案:

  1. 使用$HOME而不是~在您的.profile. $HOME始终表现得像普通变量。

  2. 不要在作业中引用该值(无论如何都不需要)。

  3. 通过将变量设置为系统上可执行文件的路径,利用在 Makefile 中运行 shell 命令make(我不会这样做,因为我认为错误的是你的值,而不是shell 对它的处理) 。bashmakeSHELLbash$PATH/bin/sh

进一步阅读:

另请注意,由于PATH已经导出(它是一个环境变量),因此您不必export在 shell 的启动文件中使用它。

相关内容