我已经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
。这就是为什么make
和which
都找不到您需要使用的命令的原因。
bash
另一方面,shell 在检查 时会执行额外的波浪号扩展步骤,$PATH
因此这就是您可以在命令行上使用该命令的原因。
在这种情况下,这是bash
奇怪的,因为实用程序在使用变量时不需要扩展波浪号$PATH
。
解决方案:
使用
$HOME
而不是~
在您的.profile
.$HOME
始终表现得像普通变量。不要在作业中引用该值(无论如何都不需要)。
通过将变量设置为系统上可执行文件的路径,利用在 Makefile 中运行 shell 命令
make
(我不会这样做,因为我认为错误的是你的值,而不是shell 对它的处理) 。bash
make
SHELL
bash
$PATH
/bin/sh
进一步阅读:
- 为什么波形符 (~) 不在双引号内展开?'t-波形符-在双引号内展开
- ~ 是否始终等于 $HOME
另请注意,由于PATH
已经导出(它是一个环境变量),因此您不必export
在 shell 的启动文件中使用它。