[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]


Anmelden zum Antworten