私は研究室の問題のために普遍的なmakefileを作成しようとしています。 5つのタスクがあり、それぞれが別々のCファイルをコンパイルして実行する必要があります。 gccを使っていくつかのライブラリを追加する必要があるので、make ZAD=first second
と入力してfirst.cとsecond.cをコンパイルしてください。問題は、makefileのZAD
リストから正しく反復する方法がわからないことです。 for
ループ内のタスクを分けることができますが、このループで改行文字を強制することはできません。この例では(以下は、私のメイクファイルである)、より良い説明します:makeに引数として複数のファイルがあります。私のアプローチは大丈夫ですか?
[email protected]:~/mownit/lab1dom$ make ZAD=second
gcc -Wall -c second.c
gcc second.o -lgsl -lgslcblas -lm -o second
rm second.o
、すべての罰金が、ときに私:
ZAD = first second
main: $(foreach dir, $(ZAD), $(dir).o)
$(foreach dir, $(ZAD), gcc $(dir).o -lgsl -lgslcblas -lm -o $(dir))
$(foreach dir, $(ZAD), rm $(dir).o)
first.o: first.c
gcc -Wall -c first.c
second.o: second.c
gcc -Wall -c second.c
はここで例えば、私はもっぱらsecond.cコンパイルしようとしたとき、私は何を得るのですここでは何が起こるかだ一度にfirst.cとsecond.cをコンパイルしよう:
[email protected]:~/mownit/lab1dom$ make ZAD='first second'
gcc first.o -lgsl -lgslcblas -lm -o first gcc second.o -lgsl -lgslcblas -lm -o second
gcc: error: gcc: No such file or directory
make: *** [main] Error 1
私は結論に達しました、それはだとメイクで二foreach
に何NEWLはありませんので、イン・キャラしかし、私はそれをそこに挿入する手がかりを持っていません。あるいは、この問題の別のアプローチがありますか?
EDIT:ベータ版では解決
問題、ここで私はhere
を見つけた別の方法ですが、だから私の編集したメイクファイルは次のようになります。今、意図したとおりに
define \n
endef
ZAD = first second
main: $(foreach dir, $(ZAD), $(dir).o)
$(foreach dir, $(ZAD), gcc $(dir).o -lgsl -lgslcblas -lm -o $(dir)${\n})
$(foreach dir, $(ZAD), rm $(dir).o${\n})
%.o: %c
gcc -Wall -c %.c
すべてが動作します。もう一度ベータに感謝します。
パターンルールを使用すると何が問題になりますか? – reinierpost
私は正直に言って、彼らについては知らなかった。素晴らしいアイデアだと思うけど、私はそれを私の 'main'ルールにどのように使うことができるのか分かりません。もちろん 'first.o'と' second.o'はパターンルールに簡単に変換できます。もっと説明できますか?あるいは、私の 'main'ルールを書き直すことができますか? – Wojtek
さて、私以外で何が言えるでしょう:SOは再びその魔法を働きます! – reinierpost