2012-03-08 55 views
0

我正在尝试为我的实验室问题创建一个通用的makefile。有五个任务,每个都需要编译和运行单独的C文件。由于我在使用gcc时必须包含一些额外的库,我只想输入make ZAD=first second并编译first.c和second.c。问题是我不知道如何通过makefile中的ZAD列表正确迭代。我可以将for循环中的任务分开,但我无法在此循环中强制使用换行符。这个例子将更好地解释(以下是我的makefile):多个文件作为参数。我的方法好吗?

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:

[email protected]:~/mownit/lab1dom$ make ZAD=second 
gcc -Wall -c second.c 
gcc second.o -lgsl -lgslcblas -lm -o second 
rm second.o 

,一切都很好,但是当我尽量一气呵成编译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性格。但我不知道如何将其插入。或者也许有另一种解决这个问题的方法?

编辑:
问题由贝塔解决,虽然这里的另一种方式,我发现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 2012-03-08 12:13:51

+0

老实说,我不知道他们。似乎是一个好主意,但我看不到我怎么能将它们用于我的“主要”规则。当然'first.o'和'second.o'可以很容易地转换为模式规则。你能解释更多吗?或者也许重写我的'主要'规则? – Wojtek 2012-03-08 12:23:36

+0

嗯,除了以外,我还能说些什么:SO再次发挥它的魔力! – reinierpost 2012-03-09 15:32:46

回答

3

这应做到:

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

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

通过make -r first second调用它。

第一条规则说“从something.o中构建something”。第二个说“从something.c中构建something.o”。调用中的-r表示“不要使用内置规则”(因为在something.c中构建something的内置规则优先于第一条规则)。

+0

谢谢你的回复,作品像魅力!虽然它对我来说有点神秘,所以我设法找到了一种只是稍微编辑我的代码的方法,但我已经在下面发布了它。 – Wojtek 2012-03-08 16:04:33

相关问题