1

正常に動作している、bakefile によって生成されたメイクファイルがあります。実行可能ファイルを実行するには、別のフォルダーのライブラリが必要です。これらのライブラリへのパスを指定するために使用されるコマンド rpath を見つけました。ただし、コマンドを使用するときに引数としてメイクファイルに送信する必要があります。ベイクファイルから直接指定することはできません。

LDFLAGS 引数を使用できますが、これは問題ありません。そして、 $ORIGIN 変数の使い方をここで見つけました。

私の質問は、このエスケープがどのように機能するかです。

make LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"

makeが変数を解釈するのを防ぐための一重引用符ですか? そして、\$ が 2 回ここにあるのはなぜですか?

4

1 に答える 1

2

うん。なんて混乱。

そのため、make コマンドを開始する前に、最初の引用符のセットがシェルによって削除されます。引用符の外側のセットは二重引用符であるため、エスケープする必要があります。エスケープし$ないと、シェルはそれをシェル変数として扱います (コマンド likeecho "my path is $PWD"PWD変数の展開方法と比較してください)。シェルはバックスラッシュを使用して$.

そのため、シェルが make にコマンド ラインを渡すまでに、シェルは設定を認識します。LDFLAGS=-Wl,-rpath '-Wl,$$ORIGIN'

Makefile の次は、次のようなコマンドを含むレシピです。

$(LD) $(LDFLAGS) ...

Make はLDFLAGS上記のように変数を展開します。make の場合、a が先行する名前はすべて$make 変数と見なされ、make による展開からエスケープするには、$(シェルのようにバックスラッシュを使用しないで) を2 倍にし、 $$. Make は、$展開中に 1 つを削除します。

そのため、make はLDFLAGS文字列に還元し、-Wl,-rpath '-Wl,$ORIGIN'それをシェルに渡します。

シェルは、次のレベルの引用符 (この場合は単一引用符) を取り除きます。変数は一重引用符内で展開されないため、リンカーは実際に引数を文字どおりに取得-Wl,-rpath-Wl,$ORIGIN、これが必要です。

于 2016-11-17T19:37:12.450 に答える