1

私のプロジェクトにある多くのmakefileの1つは、-fフラグが使用されているにもかかわらず、削除するファイルがない場合にエラーコンソールにエラーを表示します。これがmakefileの問題のある行です

-rm -f *.o

行の先頭にあるダッシュを削除すると、そのトラックで停止します。したがって、これがエラーを生成している行であることがわかります。

これは、1ダースほどのmakefileを使用する大きなプロジェクトです。私が理解していないのは、他のいくつかはこの問題を抱えていないということです。

これは組み込みプログラミングの世界です。私はWindRiver2.6を使用しています(したがって、rmユーティリティは「rm.EXE」ですが、通常のオプションがあるようです)。

削除するものがない場合に「rm-f」呼び出しでエラーが発生する理由を誰かが知っていますか?

4

2 に答える 2

1

私はWindRiverツールに精通していませんが、典型的なUnixシェルとmakeツールの動作に基づいた知識に基づいた推測があります。

を実行するrm -f *.oと、次のようになります。

  • シェルは展開*.oを試み、一致するファイルがない場合はそのままにします(echo *.oそのようなファイルを含まないディレクトリと、そのようなファイルを含むディレクトリで発行してみてください)
  • 展開の結果はに渡されるrmため、一致するファイルがない場合はrm、リテラル文字列*.oを引数として呼び出されます
  • rmパターンを展開せずに、引数としてパス名として解釈します(これがシェルの仕事であるため)。-fファイルが見つからない場合は、シャットダウンします

エラーメッセージから、呼び出されたファイルが見つからrmない場合でも文句を言うという点で、あなたは壊れているように見えます。*.oこれを回避するには、最初にファイルがパターンに一致するかどうかを確認します。私はあなたの環境でそれを行う方法がわからないことを認めなければなりません。

于 2012-06-15T18:23:07.647 に答える
1

Windows環境では、「*。o」を展開してそのままrmコマンドに送信することはできません。実際rm.exeにはcygwin、たとえば、エラー終了コードで失敗します。rm.exeWindowsのcmdコマンドプロンプトから実行している間は、同じ引数でOKを完了しているように見えるため、確認するのは困難です。

$(wildcard *.o)解決策は、makefileで使用することです。「*」を付けることが重要です。そうしないと、ファイルが存在しても何も展開されません。

その結果、makeファイルの行は次のようになります。

rm -f $(wildcard *.o) $(wildcard *.elf) $(wildcard *.lst) $(wildcard *.map) $(wildcard *.sym) $(wildcard *.lss) $(wildcard *.eep) $(wildcard *.srec) $(wildcard *.bin) $(wildcard *.hex) $(wildcard *.tmp.sh)
于 2017-11-24T09:52:44.993 に答える