[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)/$@