多个文件作为参数。我的方法好吗?

时间:2012-03-08 12:11:30

标签: unix gcc makefile

我正在尝试为我的实验室问题创建一个通用的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:

wojtasskorcz@wojtek-laptop:~/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时会发生什么:

wojtasskorcz@wojtek-laptop:~/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

我得出结论,这是因为在makefile的第二个foreach中没有换行符。但我不知道如何将其插入那里。或者也许有另一种解决这个问题的方法?

编辑:
Beta解决了问题,虽然这是我找到here

的另一种方式

所以我编辑的makefile看起来像这样:

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

现在一切正常。再次感谢Beta的回答。

1 个答案:

答案 0 :(得分:3)

这应该这样做:

%: %.o
    gcc $^ -lgsl -lgslcblas -lm -o $@

%.o: %.c
    gcc -Wall -c $< -o $@

通过make -r first second调用它。

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