machen Ich habe eine Projektstruktur wie solche:Kompilieren über verschiedene Verzeichnisse mit GNU
mcts/
src/
node_queue.c
node_queue.h
tests/
munit.c # testing frame work
munit.h
list_test.C# includes node_queue.h and munit.h
Makefile # Makefile in question
Also hier mein Ziel ist es, den Test mcts/test/list_test.c zu kompilieren. Ich habe ein paar verschiedene Strategien dazu gelesen. Nach ein bisschen Lesen angepasst ich einige Dinge, die ich von Makefiles in das geschah:
CC= gcc
SOURCE= $(wildcard ../src/*.c ./*.c)
OBJECTS= $(patsubst %.c, %.o, $(SOURCE))
INCLUDE= -I. -I../src/
CFLAGS= -std=c11 -g $(INCLUDE) -Werror -Wall
list_test: list_test.o munit.o ../src/node_queue.o
$(CC) $(CFLAGS) $(INCLUDE) -o [email protected] list_test.o munit.o ../src/node_queue.o
.c.o:
$(CC) $(CFLAGS) -c $< -o [email protected]
die den am nächsten ist, ich in etwa 2 Stunden bekommen haben zu arbeiten, wenn make
in mcts/tests
Aufruf erhalte ich die Fehlermeldung:
list_test.o: In function `construct_test':
/home/----/mcts/tests/list_test.c:9: undefined reference to `construct'
collect2: error: ld returned 1 exit status
make: *** [Makefile:8: list_test] Error 1
Wo Konstrukt in mcts/src/node_queue.h
definiert ist. Sollte nicht $(INCLUDE)
sicherstellen, dass die Kopfzeile enthalten ist? Und wie kann ich das zum Funktionieren bringen?
Vielen Dank!
Zuerst brauchen Sie nicht die '.co' Regel - Make hat das eingebaut. – Novelocrat
Zweitens ist es wahrscheinlich vorzuziehen,' VPATH' zu verwenden, um die Verzeichnisse anzugeben, die Make für Objekte suchen soll, anstatt Backpfade in Ihre Abhängigkeiten und Befehle. I.e. Sie würden 'list_test: list_test.o munit.o node_queue.o' sagen und dann würde die Regel den Befehl mit den Argumenten' -o $ @ $^'ausführen, um zu sagen, dass sie alle Abhängigkeiten referenzieren soll, wo auch immer sie gefunden wurden. – Novelocrat
@Novelocrat Ich habe mir 'VPATH' angeschaut, aber ich las [dies] (http://make.mad-scientist.net/papers/how-not-to-use-vpath/), was es so aussehen ließ, als wäre es besser um andere Methoden auszuprobieren. –