makeはコマンドを見つけることができませんが、コマンドはシェルで動作します。

makeはコマンドを見つけることができませんが、コマンドはシェルで動作します。

インストールしmakeriscv32-unknown-linux-gnuツールチェーンもインストールしました。

riscv/bin私のパスに追加しました。シェルですべてのツールチェーンコマンドを正常に実行できます。作品などriscv32-unknown-linux gnu-as ... hello.s -o boot.o

を実行すると、which riscv32-unknown-linux-gnu-as端末に何も印刷されません。

私がmakemakefileのディレクトリで実行すると、私は得ます。

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がそれを見つけることができないのかわかりませんが、うまく実行できます。

**編集する**

~/.プロフィール

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

私が考えることができる唯一のことは、パスが奇妙だということです。これはWSLにあります。

答え1

二重引用符内にチルダ文字(~)を使用すると、通常はホームディレクトリに展開されません。値を見ると、$PATH以下が含まれていることがわかります。言葉ホームディレクトリのフルパスの代わりにチルダを使用します(作業で値を二重引用符で囲まない場合はそうなります)。

makeシェルコマンドを実行するために使用されるシェル(/bin/shおそらくシェルdash)であり、ユーザーのwhichコマンドはの値に追加のチルダ拡張ステップを実行しません$PATH。そのため、make使用するwhich必要があるコマンドが見つかりません。

bash一方、シェルは検査時に追加のチルダ拡張ステップを実行するため、$PATHコマンドラインからこのコマンドを使用できます。

この場合、bash変数を使用するときにユーティリティはチルダを拡張する必要がないため、これは奇妙です$PATH

解決策:

  1. $HOME代わりに~.Always.profileを使用すると、$HOME通常の変数のように動作します。

  2. ジョブでこの値を参照しないでください(とにかく必要ありません)。

  3. 変数をシステムの実行可能ファイルパスに設定することで、Makefileでシェルコマンドを実行するという利点を活用してくださいmake(シェルが処理するのではなく、ユーザーの値が間違っていると思うため、これは実行されません)。bashmakeSHELLbash$PATH/bin/sh

追加資料:

また、エクスポートされたものなので(環境変数)シェルの起動ファイルで使用するPATH必要はありません。export

関連情報