[Linux] make verwenden zum compilieren mit gcc, erzeugt nicht alle o-Dateien
-
Hallo c-community,
heute mal eine allgemeine Frage zu kompilieren mit make. Also ich habe folgende makefile geschrieben:
VERSION = 0.0.2 CC = gcc CFLAGS = -ggdb -Wall -DVERSION=\"$(VERSION)\" LDFLAGS = -lpthread ODIR = obj HELP_SDIR = ../LibHelp/src HELP_IDIR = ../LibHelp/header HELP__DEPS = conio.h errmsg.h clear.h HELP_DEPS = $(patsubst %,$(HELP_IDIR)/%,$(HELP__DEPS)) HELP__OBJ = conio.o errmsg.o clear.o HELP_OBJ = $(patsubst %,$(ODIR)/%,$(HELP__OBJ)) $(ODIR)/%.o: $(HELP_SDIR)/%.c $(HELP_DEPS) $(CC) -c -o $@ $< $(CFLAGS) CLASSES_SDIR = ../Classes/src CLASSES_IDIR = ../Classes/header CLASSES__DEPS = CLASS_Socket.h CLASS_Client.h CLASS_Object.h CLASSES_DEPS = $(patsubst %,$(CLASSES_IDIR)/%,$(CLASSES__DEPS)) CLASSES__OBJ = CLASS_Socket.o CLASS_Client.o CLASS_Object.o CLASSES_OBJ = $(patsubst %,$(ODIR)/%,$(CLASSES__OBJ)) $(ODIR)/%.o: $(CLASSES_SDIR)/%.c $(CLASSES_DEPS) $(CC) -o $@ -c $< $(CFLAGS) COM_SDIR = src COM_IDIR = header COM__DEPS = main.h PrimerAndSubClient.h COM_DEPS = $(patsubst %,$(COM_IDIR)/%,$(COM__DEPS)) COM__OBJ = main.o PrimerAndSubClient.o COM_OBJ = $(patsubst %,$(ODIR)/%,$(COM__OBJ)) $(ODIR)/%.o: $(COM_SDIR)/%.c $(COM_DEPS) $(CC) -o $@ -c $< $(CFLAGS) clientCommunication: $(HELP_OBJ) $(CLASSES_OBJ) $(COM_OBJ) gcc -o $@ $+ $(CFLAGS) $(LDFLAGS) .PHONY: clean clean: rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
Vorher lagen die .h- und .c-Dateien der Classes in verschiedenen Ordnern und wurden in der neuen Version in einen gemeinsamen Ordner einsortiert.
Wenn ich jetzt aber compilieren will, sehe ich, dass die Klassen-Dateien gar nicht mehr compiliert werden. Leider finde ich gerade (seit 2-3h) keinen wirklichen Fehler und bitte euch mir hierbei zu helfen.
Warum werden die CLASSES_OBJ nicht mehr erzeugt. Mehrfaches "make clean" gefolgt von "make" führen immer zur Fehlermeldung, dass die Funktionen aus den Klassen im clientCommunication-Programm nicht referenziert sind (undefined reference)
Vielen Dank
mirrowwinger[EDIT1]Also wenn ich die Kompilieranweisung für das Programm wie folgt abändere:
clientCommunication: $(HELP_OBJ) $(CLASSES_OBJ) $(COM_OBJ) gcc -o $@ $+ $(CFLAGS) $(LDFLAGS) ../Classes/src/CLASS_Client.c
wird die erste (von mehreren Klassen) anscheinend richtig verwendet. Ich dachte aber bisher die Verwendung der Object-Dateien (o-Dateien) würde genau dies unnötig machen und bei den Funktionen der LibHelp (1. Block) funktioniert dies auch genau so.
Bin ziemlich verwirrt, warum anscheinend die Reihenfolge für die Erstellung dieser o-Dateien hier nicht hinhaut und warum die Classen nicht kompilieren.[/EDIT1]