次のルールのようなMakefileを試しましたが、うまくいきません(GNU Make 4.0):
foo: [email protected] other.o
bar: bar.o other.o
ファイルはfoo.c
コンパイルされますが、foo.o
リンクコマンドはですcc -o .o
。
代わりにbar
正しくコンパイルされてcc bar.o other.o -o bar
。
誰でも違い(または問題)を説明できますか?
答え1
この内容は次のセクションで説明します。自動変数GNU Makeマニュアルから:
自動変数に使用できる値の限られた範囲を認識することが重要です。自動変数にはレシピ内の値のみがあります。特に、ルールのターゲットリストのどこでも使用できません。これには値がなく、空の文字列に展開されます。また、ルールの前提条件リストから直接アクセスすることはできません。よくある間違いは、
$@
前提条件リストで使用しようとすることです。
この段落の残りの部分では、GNU Make専用のソリューションですが、可能な解決策を提供します。2番目の拡張。 Makefile を次のように作成します。
.SECONDEXPANSION:
foo: [email protected] other.o
bar: bar.o other.o
$$@
適切な値を与えることができ、
$ make foo
cc -c -o foo.o foo.c
cc -c -o other.o other.c
cc foo.o other.o -o foo
あなたが望むことをしてください。
(私の経験では、二次展開に頼るよりも問題を解決するためのより良い方法がよくありますが、これは実行したい作業の全体的な目標を理解しなければ決定できません。)