2010-04-24 39 views

回答

41
SRCS = $(wildcard *.c) 

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

all: $(PROGS) 

%: %.c 

     $(CC) $(CFLAGS) -o [email protected] $< 
+6

提醒您最后的间距实际上是一个选项卡。 – 2010-04-24 20:59:15

+0

@马丁精彩!但我不明白你为什么不在主线上调用PROGS和SRCS。 – 2015-02-06 18:12:25

+0

@ user4050,对不起,我错过了你的问题。默认的'all'目标构建'$(PROGS)',主线表示如何从'%.c'文件构建没有扩展名的文件,这就是'$(PROGS)'的文件, $(SRCS)'是。 – 2015-12-23 10:55:35

7

我不认为你甚至需要一个makefile - 默认隐make规则应该这样做:

$ ls 
src0.c src1.c src2.c src3.c 
$ make `basename -s .c *` 
cc  src0.c -o src0 
cc  src1.c -o src1 
cc  src2.c -o src2 
cc  src3.c -o src3 

编辑来让命令行稍微简单一些。

4
SRCS = $(wildcard *.c) 

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

all: $(PROGS) 

%: %.c 
     $(CC) $(CFLAGS) -o [email protected] $< 
clean: 
     rm -f $(PROGS) 

通过添加“干净”目标来改善Martin Broadhurst的回答。 “make clean”会清除所有可执行文件。

+0

你应该为'clean'这样的目标使用'.PHONY'。请参阅http://stackoverflow.com/questions/2145590/what-is-the-purpose-of-phony-in-a-makefile。 – 2017-01-13 16:12:43

+0

@MartinBroadhurst你也应该为目标'all'使用'.PHONY'。 – iBug 2017-11-08 05:11:06

相关问题