2012-04-03 45 views
7

我的问题看似简单,但我已经失去了几个小时的试图获得解决方案的研究。我试图创建一个Makefile来为目录中的每个.c文件构建一个可执行文件。Makefile - 为文件夹中的每个.c制作一个可执行文件

我曾尝试以下:

CC = gcc 
SRCS = $(wildcard *.c) 
OBJS = $(patsubst %.c,%.o,$(SRCS)) 

all: $(OBJS) 
$(CC) $< -o [email protected] 

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

,但这种方式可以创建只.o文件,而不是任何可执行文件。我需要一个规则为这些.o文件中的每一个制作可执行文件。类似如下:

gcc src.o -o src 
+0

FWIW, HTH http://stackoverflow.com/questions/5950395/makefile-to-compile-multiple-c-programs/13696012#13696012 – Robert 2012-12-04 12:43:41

回答

1

all告诉它只是为了构建目标文件。添加类似

EXEC = $(patsubst%.C,%,$(SRCS))

所有:$(EXEC)

5

rob's答案似乎并不在我的机器上工作。也许,作为完整的Makefile:

SRCS = $(wildcard *.c) 

all: $(SRCS:.c=) 

.c: 
    gcc $(CPFLAGS) $< -o [email protected] 

(最后两行,是我的机器上,不必要的,因为默认的规则是适当的。)

+1

这正是我想要的。非常感谢。 无法正确使用':'。 – eduardomoroni 2012-04-04 11:04:52

+0

@eduardomoroni:你应该注意你的宏'CPFLAGS'的名字是非标准的。它通常应该是'CFLAGS'或'CPPFLAGS'或两者。参见[CFLAGS vs CPPFLAGS](// stackoverflow.com/q/2754966)。 – 2018-03-06 17:47:46

+0

@eduardomoroni:顺便说一句,如果你发现这个六岁的答案是有帮助的,那么也许你应该'接受'它?谢谢。 – 2018-03-07 00:46:10

0

尝试以下操作:

% : %.c 
    $(CC) $(CFLAGS) $(CPPFLAGS) -o [email protected] $< 
all: $(basename $(wildcard *.c)) 

而且你甚至不需要前两行,因为make知道如何编译和链接.c文件为可执行文件。不过,通常有必要更改make的内置食谱。

相关问题