[makefile] Objectdateien in einen Ordner (build) erstellen.



  • Hallo c-community,

    ich schreibe mir gerade eine makefile. Hier mein derzeitiger Stand:

    VERSION     :=  0.0.1
    CC          :=  gcc
    WARNINGS    :=  -Wall -Wextra -pedantic -Wshadow -Wpointer-arith -Wcast-align \
                    -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations \
                    -Wredundant-decls -Wnested-externs -Winline -Wno-long-long \
                    -Wuninitialized -Wconversion -Wstrict-prototypes
    DEBUG       :=  -ggdb
    CFLAGS      :=  -std=c99 $(WARNINGS) $(DEBUG) -DVERSION=\"$(VERSION)\"
    LDFLAGS     :=  -lpthread
    
    BUILD       :=  build
    SOURCE      :=  sources
    BINARY      :=  name
    
    RM          :=  rm -rf
    MKDIR       :=  mkdir
    
    $(BUILD)/%.o: $(SOURCE)/%.c
    	@$(CC) $(CFLAGS) $(LDFLAGS) -MMD -MP -c $< -o $@
    
    .PHONY: all setup clean
    
    all:
    	$(BINARY)
    
    setup:
    	$(MKDIR) $(BUILD)
    
    clean:
    	@$(RM) $(BINARY) $(OBJECTS) $(BUILD)
    

    Ich weiß es fehlen noch Teile wie die Erstellung der Binärdatei aber dies hat auf meinem Problem keine Auswirkungen (denke ich).
    Mir geht es um die Erstellung der Objectdateien. Wie zu sehen ist, liegen die Header- und Quellcodedateien in einem Unterordner "sources". Und gemäß Zeile 18 sollen mit den Dateien aus dem Ordner sources die Objectdateien erstellt werden in einem Unterordner "build". Dies klappt aber nicht!
    Ich starte das Erzeugen einer Objectdatei wie folgt:

    make test.o

    und erhalte folgenden Fehler:

    make: *** Keine Regel, um »test.o« zu erstellen. Schluss.

    Wenn ich die Zeile 18 wie folgt abändere:

    %.o: $(SOURCE)/%.c
    

    kompiliert die Objectdatei ohne Fehler liegt aber nicht im Unterordner "build" sondern im gleichen Ordner in dem die makefile liegt.

    Hier auch noch meine Quellcode- und Headerdatei mit denen ich dies getestet habe:
    test.c

    #include "test.h"
    
    pClass  Class_init(void){
        pClass Class;
        if (NULL == (Class = malloc(sizeof(tClass))))    return NULL;
    
        Class->Type = 0;
        Class->free = Class_free;
        return Class;
    }
    
    void    Class_free(pClass Class){
        if (NULL != Class){
            free(Class);
        }
    }
    

    test.h

    #ifndef TESTHEADER
    #define TESTHEADER
    
    #include    <stdlib.h>
    
    typedef struct _Class{
        int     Type;
        void    (*free)(struct _Class* Class);
    }tClass, *pClass;
    
    pClass  Class_init(void);
    
    void    Class_free(pClass Class);
    
    #endif
    

    Hoffe jemand kann mir hier helfen. Das Ziel ist die Erstellung der .o-Dateien im Ordner "build".

    MfG

    mirrowwinger

    [Edit 1] Tags geändert/ verbessert [/Edit 1]



  • Probiere mal:

    %.o: $(SOURCE)/%.c
        @$(CC) $(CFLAGS) $(LDFLAGS) -MMD -MP -c $< -o $(BUILD)/$@
    

Log in to reply