2016-11-17 14 views
0

bakefileによって正常に動作するmakefileが生成されています。実行可能ファイルを実行するには、別のフォルダのライブラリが必要です。 rpathコマンドがこれらのライブラリへのパスを指定するのに使われているのを発見しました。しかし、コマンドを使うときには引数としてmakefileに送る必要があります。 bakefileから直接指定することはできません。システム変数をエスケープして引き数として渡す

私はLDFLAGS引数を使うことができます。そして私はhere $ ORIGIN変数の使い方を見つけました。

私の質問はどのようにこのエスケープ動作ですか?

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

変数を解釈するために作る防ぐために、単一引用符ですか? なぜ\ $がここに2回あるのですか?

答えて

1

Yeesh。何が混乱している。

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

、時間によってシェル手にするコマンドライン、それはあなたのメイクファイルで設定LDFLAGS=-Wl,-rpath '-Wl,$$ORIGIN'

次を見ていると、このようなコマンドを使用して、レシピのようになります

$(LD) $(LDFLAGS) ... 

意志を作ります上記のように変数LDFLAGSを展開します。 makeの場合、$が前に付いている名前はmake変数とみなされ、$(シェルのようなバックスラッシュは使用しない)を2倍して、$$と書くことによって、拡張によってエスケープします。 makeは、展開中に$を削除します。

したがって、LDFLAGSを文字列-Wl,-rpath '-Wl,$ORIGIN'に減らし、それをシェルに渡します。

シェルは次のレベルの引用を取り除きます。この場合は一重引用符です。変数はシングルクォートの中で展開されないので、実際にはリンカは引数を得ます。実際には-Wl,-rpath-Wl,$ORIGINが必要です。

+0

ワケありがとう、私の脳を傷つけるようにエスケープの3つのレベル... –

関連する問題