Chcę mieć schludny plik makefile zawierający jawne zależności, ale umieszczając wszystkie obiekty .o w osobnym katalogu, aby połączyć go później (w innym pliku).

Problem polega na tym, że mój make zatrzymuje się po skompilowaniu pierwszego źródła, a następnie zatrzymuje się bez żadnego błędu.

CC=gcc
CFLAGS=-c -Wall -pedantic -std=c99

DIR=../obj

$(DIR)/CList.o : CList.c CList.h CList_aux.h Observation.h CList_View_aux.h
    $(CC) $(CFLAGS) CList.c -o $@
$(DIR)/CList_aux.o : CList_aux.c CList.h CNode.h
    $(CC) $(CFLAGS) CList_aux.c -o $@
$(DIR)/CList_View_aux.o : CList_View_aux.c CNode.h Observation.h
    $(CC) $(CFLAGS) CList_View_aux.c -o $@
$(DIR)/CNode.o : CNode.c CNode.h CNode_aux.h Observation.h CList.h
    $(CC) $(CFLAGS) CNode.c -o $@
$(DIR)/CNode_aux.o : CNode_aux.c CNode.h Observation.h
    $(CC) $(CFLAGS) CNode_aux.c -o $@
$(DIR)/Observation.o : Observation.c Observation.h Observation_aux.h CNode.h
    $(CC) $(CFLAGS) Observation.c -o $@
$(DIR)/Observation_aux.o : Observation.c Observation.h
    $(CC) $(CFLAGS) Observation_aux.c -o $@
$(DIR)/Record.o : Record.c Record.h Observation.h
    $(CC) $(CFLAGS) Record.c -o $@
0
yauser 19 październik 2012, 00:20

2 odpowiedzi

Najlepsza odpowiedź

Domyślnie make buduje pierwszy cel w pliku makefile. W tym przypadku jest to ${DIR}/CList.o.

Potrzebujesz innego pierwszego celu, zwykle nazywanego all:

OBJECTS = \
    $(DIR)/CList.o \
    $(DIR)/CList_aux.o \
    $(DIR)/CList_View_aux.o \
    $(DIR)/CNode.o \
    $(DIR)/CNode_aux.o \
    $(DIR)/Observation.o \
    $(DIR)/Observation_aux.o

all: ${OBJECTS}

Zauważ, że działa to niezależnie od tego, czy w ${DIR} są jakieś pliki obiektowe; symbol wieloznaczny szukający plików obiektowych w katalogu upewnia się, że te, które zostały już raz skompilowane, są aktualne, ale nie próbuje budować tych, których wcześniej nie udało się skompilować lub po prostu ich tam nie ma.

0
Jonathan Leffler 19 październik 2012, 00:34

Jeśli plik Makefile jest naprawdę taki sam, jak opublikowałeś, oznacza to, że brakuje Ci reguły all:. Bez wyraźnej reguły all make zakłada, że ​​ma zostać utworzona pierwsza obecna reguła, więc zatrzymuje się po niej. Aby osiągnąć to, co chcesz, dodaj (dołącz) to do pliku Makefile (odpowiednio zmień ostateczną nazwę pliku wykonywalnego):

OBJECTS = $(wildcard $(DIR)/*.o)

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
        $(LD) $(LDFLAGS) -o $@ $^
0
user529758user529758 19 październik 2012, 00:26