Makefile模式匹配失败

时间:2014-08-01 09:52:30

标签: makefile gnu-make

BINS = $(patsubst %.c, %, $(SRCS))

all: $(BINS)

%: %.o
        $(info ---------- linking $< ---------)
        $(CC) $< -o $@ -L$(LIBPATH) -llibrary

$(BINS)中的姓名是否与%匹配?我需要调用规则%: %.o,然后调用其他规则来创建.o。但是这种匹配并没有发生,因为隐含的规则被触发了。

我的目标是创建与.c文件同名但没有扩展名的二进制文件。应在流程中创建.o

2 个答案:

答案 0 :(得分:2)

这可能听起来很激烈,但您应该删除所有规则,然后它才会起作用。是的,我很认真。 make具有通过编译从foo创建foo.c的内置规则,因为它非常常见。观察它发生:

$ cat hello.c
#include <stdio.h>

int main (void)
{
    printf ("hello, world\n");
    return 0;
}
$ cat Makefile
cat: Makefile: No such file or directory

$ make CFLAGS=-lm hello
cc -lm  hello.c  -o hello
$ ./hello
hello, world
$

更现实地说,如果你想从他们的* .c对应物编译一组可执行文件,你在Makefile中需要的只是

all: prog1 prog2 progN
很好,不是吗?

答案 1 :(得分:1)

这对我有用:

all : ${BINS}

%.o: %.c
    $(CC) -c -o $@ $<

$(BINS) : %: %.o
    @echo ---------- linking $< ---------
    $(CC) -o $@ $< -L$(LIBPATH) -llibrary

一次编译和链接会更简单:

$(BINS) : %: %.c
    @echo ---------- compiling and linking $< ---------
    $(CC) -o $@ $<