2012-04-03 15 views
7

Moje pytanie jest zwodniczo proste, ale straciłem kilka godzin nauki, próbując znaleźć rozwiązanie. Próbuję utworzyć plik Makefile, który tworzy plik wykonywalny dla każdego pliku .c w katalogu.Makefile - Wykonaj plik wykonywalny dla każdego pliku .c w folderze

Próbowałem następujące:

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

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

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

ale ten sposób jest tylko tworzenie .o pliki, a nie wszystkie pliki wykonywalne. Potrzebuję reguły, która czyni wykonywalny dla każdego z tych plików .o. Coś jak następuje:

gcc src.o -o src 
+0

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

Odpowiedz

1

Twój all mówi to po prostu zbudować pliki obiektu. Dodaj coś

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

wszystkich: $ (EXEC)

5

rob's odpowiedź nie wydają się działać na moim komputerze. Być może, jak kompletnego Makefile:

SRCS = $(wildcard *.c) 

all: $(SRCS:.c=) 

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

(ostatnie dwie linie, są na moim komputerze, niepotrzebne, ponieważ domyślne reguły są wystarczające.)

+1

To jest dokładnie to, co chciałem. Bardzo dziękuję. nie można poprawnie użyć ":". – eduardomoroni

+0

@eduardomoroni: Należy zauważyć, że nazwa makra 'CPFLAGS' jest niestandardowa. Zazwyczaj powinno to być 'CFLAGS' lub' CPPFLAGS' lub oba. Zobacz [CFLAGS vs CPPFLAGS] (// stackoverflow.com/q/2754966). –

+0

@eduardomoroni: Przy okazji, jeśli uważasz tę sześcioletnią odpowiedź za pomocną, to może powinieneś ją zaakceptować? Dziękuję Ci. –

0

Spróbuj wykonać następujące czynności:

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

i nie potrzebujesz nawet pierwszych dwóch linii, ponieważ make wie, jak kompilować i łączyć pliki .cc w pliki wykonywalne. Jednak często konieczna jest zmiana wbudowanych receptur make.

Powiązane problemy