2012-03-08 5 views
0

私は研究室の問題のために普遍的な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 

すべてが動作します。もう一度ベータに感謝します。

+0

パターンルールを使用すると何が問題になりますか? – reinierpost

+0

私は正直に言って、彼らについては知らなかった。素晴らしいアイデアだと思うけど、私はそれを私の 'main'ルールにどのように使うことができるのか分かりません。もちろん 'first.o'と' second.o'はパターンルールに簡単に変換できます。もっと説明できますか?あるいは、私の 'main'ルールを書き直すことができますか? – Wojtek

+0

さて、私以外で何が言えるでしょう:SOは再びその魔法を働きます! – reinierpost

答えて

3

これはそれを行う必要があります。

%: %.o 
    gcc $^ -lgsl -lgslcblas -lm -o [email protected] 

%.o: %.c 
    gcc -Wall -c $< -o [email protected] 

make -r first secondで、それを起動します。

最初のルールでは、「somethingからsomething.oのビルド」と表示されます。 2番目の数字は「something.oからsomething.cのビルド」です。起動時の-rには「組み込みルールを使用しない」と記載されています(something.cのうちsomethingをビルドするための組み込みルールがあるため、最初のルールよりも優先されます)。

+0

あなたの返信ありがとう、魅力のように動作します!ちょっと不思議なことですが、私のコードをわずかに編集するしか方法が見つからないので、私は下に掲載しました。 – Wojtek

関連する問題