BINS = $(patsubst %.c, %, $(SRCS))
all: $(BINS)
%: %.o
$(info ---------- linking $< ---------)
$(CC) $< -o $@ -L$(LIBPATH) -llibrary
$(BINS)
中的姓名是否与%
匹配?我需要调用规则%: %.o
,然后调用其他规则来创建.o
。但是这种匹配并没有发生,因为隐含的规则被触发了。
我的目标是创建与.c
文件同名但没有扩展名的二进制文件。应在流程中创建.o
答案 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 $@ $<