Path

Make找不到命令,但該命令在shell中有效

  • November 8, 2019

我已經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 上

波浪號 ( ~) 在雙引號中使用時通常不會擴展到您的主目錄。如果您查看您的$PATH值,您會看到它包含一個文字波浪號,而不是您的主目錄的完整路徑(如果您沒有在賦值中雙引號,它會這樣做)。

make用於執行 shell 命令(可能/bin/shdashshell)的 shell 和您的which命令不會對$PATH. 這就是為什麼兩者都make找不到which您需要使用的命令的原因。

bash另一方面,shell 在檢查 時會執行額外的波浪號擴展步驟,$PATH因此這就是您可以在命令行上使用該命令的原因。

在這種情況下,這是一個奇怪的情況,因為實用程序在使用變數bash時不需要擴展波浪號。$PATH

解決方案:

  1. 使用$HOME而不是~在您的.profile. $HOME總是表現得像一個正常的變數。
  2. 不要引用賦值中的值(無論如何都不需要)。
  3. 通過將變數設置為系統上執行檔的路徑,make用於在Makefilebash中執行 shell 命令(我不會這樣做,因為我認為錯誤是你的值,而不是shell 對它的處理) .make``SHELL``bash``$PATH``/bin/sh

進一步閱讀:

另請注意,由於PATH已經導出(它是一個環境變數),因此您永遠不必export在 shell 的啟動文件中使用它。

引用自:https://unix.stackexchange.com/questions/551194