/ / make zawsze odbuduj - makefile

zawsze się odbudowuj - makefile

Mój plik Makefile to:

OBJS = b.o c.o a.o
FLAGS = -Wall -Werror
CC = gcc

test: $(OBJS)
$(CC) $(FLAGS) $(OBJS) -o test
b.o: b.c b.h
$(CC) $(FLAGS) -c b.c
a.o: a.c b.h c.h
$(CC) $(FLAGS) -c a.c
c.o: c.c c.h
$(CC) $(FLAGS) -c c.c
clean:
rm a
rm *.o
all: test

Jeśli zrobię make następnie make ponownie, zawsze odbudowuje "test". Dlaczego to robi?

Nawet jeśli to zrobię: make a.o odbudowuje ... Jestem na Linux, jeśli to pomaga.

W oknach, jeśli zmienię "test" na "test.exe" i "-o test" przez "-o test.exe", to działa dobrze. Sądzę więc, że z jakiegoś powodu "make" w moim linuxie nie mogę sprawdzić datestampów moich plików w katalogu.

NAPRAWIŁEM TO! .C zostały utworzone w systemie Windows. Otworzyłem wszystkie .c i .h w vi, i bez robienia niczego zapisałem zmiany i wszystko działało. Myślę, że to zostało naprawione.

Odpowiedzi:

14 dla odpowiedzi № 1

Twoja pierwsza zasada to:

test: $(OBJS)

Oznacza to, że jeśli plik o nazwie "test" nie istnieje,Reguła powinna zostać uruchomiona i utworzyć ją. Ponieważ "test" nigdy nie istnieje (ta reguła faktycznie nie tworzy pliku o nazwie "test"), jest uruchamiany za każdym razem. Powinieneś zmienić "test" na "a", rzeczywisty wynik tej reguły

Na wypadek, gdyby reguła nie tworzyła rzeczy po lewej stronie, należy ją oznaczyć:

.PHONY: test

2 dla odpowiedzi nr 2

Musisz to określić test jest fałszywy cel:

OBJS = b.o c.o a.o
CFLAGS = -Wall -Werror
CC = gcc

.PHONY: all test clean
# "all" and "clean" are also phony

all: test
test: a

a: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o a

b.o: b.c b.h
a.o: a.c b.h c.h
c.o: c.c c.h

clean:
rm a
rm *.o

Umieściłem wszystko najpierw jest to domyślny cel (który jest często spotykany), usunięto komendy do kompilacji (już je posiadasz) i zmieniono FLAGI do CFLAGS (co jest popularną nazwą dla flag kompilatora C i używaną przez wbudowane reguły make).


2 dla odpowiedzi nr 3

W ostateczności możesz uruchomić tryb Make in debug(make -d) i przeczesuj wyjście. Zanim spróbujesz, sugeruję dodanie linii do reguły "testowej", aby sprawdzić, czy są jakieś warunki wstępne, które Make Thinks wymagają przebudowy testu (i użyj pewnych zmiennych automatycznych w komendzie kompilacji, jako dobrej praktyki).

test: $(OBJS)
@echo prereqs that are newer than test: $?
$(CC) $(FLAGS) $^ -o $@