2017-09-06 2 views
2

これはStackoverflowに関する私の最初の質問です。私が何かばかげて尋ねるなら、私を許してください。

問題:
「my dir /」ディレクトリにあるプログラムをスペースで区切りたいとします。プログラムのパス名が "my dir/test.c"であるとします。ここで

私がしようとしていたサンプルのmakefileです:
makeルールでMAKEFILEが文字列内のバックスラッシュシーケンスを保持する方法を教えてください。

CC = gcc 
DIR = my\ dir 
$(DIR)/test.out: $(DIR)/test.c 
# $(CC) $< -o [email protected] 
    $(CC) $(DIR)/test.c -o $(DIR)/test.out 



あなたが最後の行(行-5)で、私は元のパス名と書かれていることを見ることができるように前提条件とターゲットにそれぞれ記述されたファイルを直接出力します。それは、コマンドを生成するので、これは正常に動作やって:GCCや他に(スペースを含む)のファイル名を渡すの私の\ DIR/test.outに-o
gccの私の\ DIR/test.cの
た構文的に正しい方法シェルコマンド。

2番目の最後の行(行-4)は、問題のある行です(コメント行)。私は、自動変数$ @を(ターゲット)と$ <を使用しました(最初で唯一の前提条件)私は
私\ dirを/ test.outに私の\ディレクトリであることが予想GCCのファイル名引数を生成します/test.cである。しかし何らかの理由で、何らかの理由で、生成されたファイル名がmy dir/test.outmy dir/test.cであるため、出力されるコマンドは
gcc my dir/test.c -o my dir/testです。 .out
ここで、gccは私のdir/test.cを別々の2つの異なる入力ファイル名とみなし、エラーが発生します。
make output

私の質問:
ものもバックスラッシュを保持する方法はありIのコメントを解除行-4とコメント行-5上記のMakefileの時にここで
は、生成されたエラー出力のスクリーンショットです私は自動変数を使っていましたか?または、自動変数を使用するのと同じ目標を達成し、私の問題を解決する代替手段がありますか?ここでは柔軟性が重要なので、

ご協力いただきありがとうございます。

答えて

1

自動変数には二重引用符または一重引用符を使用してください。あなたが自動変数が参照する値のシェル拡張を避けたい場合は

使用単一引用符は、:

$(DIR)/test.out: $(DIR)/test.c 
    $(CC) '$<' -o '[email protected]' 

二重引用符は、シェル拡張を可能にします。例えば、DIRでドル記号があった場合:

DIR := $$my\ dir 

が、その後"[email protected]""$my dir"に拡大する、とシェルは変数として$my解釈します。

+0

それは働いた!どのように私はこれを考えていない可能性があります!さて、一重引用符を使用すると、生成されたコマンドはgcc 'my dir/test.c' -o 'my dir/test.out'になります。二重引用符の場合も同様です。私の場合。ありがとう@RuslanOsmanov。あなたは私の日を救った –

関連する問題