2016-08-03 21 views
0

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!

+0

Zuerst brauchen Sie nicht die '.co' Regel - Make hat das eingebaut. – Novelocrat

+0

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

+0

@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. –

Antwort

1

Für Ihren tatsächlichen Fehler melden Sie einen Verknüpfungsfehler an ein undefiniertes Symbol. Wenn das Objekt oder die Funktion dieses Namens in node_queue.h definiert wurde, erhalten Sie stattdessen eine Mehrfachdefinition Fehler für construct.

Was Sie wahrscheinlich vermissen, ist, dass Sie eine Deklaration in diesem Header haben, aber keine Definition in node_queue.c.

+0

Ja, ich habe gerade 5 Stunden verloren, um das Konstrukt contsruct zu schreiben ... aber ich habe mein Makefile in der Reihenfolge [gist] (https://gist.githubusercontent.com/Beaudidly/b374790854a91f2e3f3f1c077381c571/roh/2c1488010ebc7d3c11b26bf34add51c63e04da25/Makefile) –

+0

Es passiert uns allen. – Novelocrat