2016-06-18 10 views
1

Ich habe folgendes Makefile:C Makefile - exec und Objektdateien auf verschiedene Verzeichnisse

CC=gcc 
CFLAGS=-Wall -g -Wextra -DNDEBUG $(OPTFLAGS) 

VPATH=%.c src 
VPATH=%.h src 
VPATH=%.o obj 
SOURCES=$(wildcard **/*.c *.c) 
OBJECTS=$(patsubst %.c,obj/%.o,$(SOURCES)) 

TEST_SRC=$(wildcard tests/*_tests.c) 
TESTS=$(patsubst,%.c,%o,$(TEST_SRC)) 

TARGET=bin/ex 

$(OBJECTS):$(SOURCES) 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

# The target build 
all:$(TARGET) 

$(TARGET):CFLAGS+=-fPIC 
$(TARGET):build $(OBJECTS) 
    $(CC) -c $(CFLAGS) $< -o [email protected] $(OBJECTS) 

Was ich versuche zu achive alle mit * .o Dateien in obj Verzeichnis haben und die endgültige ausführbare Datei in den Papierkorb Verzeichnis.

Struktur Ordner wie folgt:

project/ 
    src/ 
    obj/ 
    bin/ 

Wenn ich machen alle betreibe ich die folgende Fehlermeldung erhalten, die ich nicht in der Lage bin zu beheben: nicht schaffen obj/src/ex.o: No such Datei oder Verzeichnis

Offensichtlich seine Ausrichtung auf den falschen Weg. jede Hilfe würde geschätzt werden.

EDIT

Basierend auf ersten Kommentar, den ich auf meine Frage habe ich das Makefile aufgeräumt und kam mit der folgenden Lösung, die die Arbeit erledigt, außer dass es erstellt das „src“ Unterordner in " obj ". Einer meiner Fehler war, dass ich die -c-Flagge benutzte, als ich versuchte, den Exec zu bauen.

CC=gcc 
CFLAGS=-Wall -g -Wextra -DNDEBUG $(OPTFLAGS) 
LIBS=-ldl $(OPTLIBS) 
#PREFIX?=/usr/local 

SOURCESDIR=src 
OBJECTSDIR=obj 
SOURCES=$(wildcard **/*.c *.c) 
OBJECTS=$(patsubst %.c,obj/%.o,$(SOURCES)) 

TEST_SRC=$(wildcard tests/*_tests.c) 
TESTS=$(patsubst,%.c,%o,$(TEST_SRC)) 

TARGET=bin/ex 

$(OBJECTS):$(SOURCES) 
    @$(call make-repo) 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

# The target build 
all:$(TARGET) tests 

dev:CFLAGS=-Wall -g -Isrc -Wextra $(OPTFLAGS) 
dev:all 


$(TARGET):CFLAGS+=-fPIC 
$(TARGET):build $(OBJECTS) 
    $(CC) $(OBJECTS) $(LDFLAGS) -o [email protected] 

build: 
    @mkdir -p bin 

define make-repo 
    for dir in $(SOURCESDIR); \ 
    do \ 
    mkdir -p $(OBJECTSDIR)/$$dir; \ 
    done 
endef 
+1

Ich fürchte, Ihre Make-Datei durch Probleme gebrochen ist viel größeren als die von Ihnen fragen nach und haben nichts damit zu tun. Ich schlage vor, dass Sie dieses Problem beiseite legen, bis Sie in der Lage sind, ein Makefile zu schreiben, das erfolgreich die Objektdateien und die ausführbare Datei in einem Verzeichnis erstellt, und wenn Sie es haben, kommen Sie mit Ihrer Frage zurück. –

Antwort

0

Sie übergeben die Pfadsubstitution nicht korrekt, es gibt trotzdem eine Kurzschrift dafür. Auch wird Ihr Link Regel gebrochen, da es nicht (-c) einen Anknüpfungspunkt, aber es gibt eine eingebaute Rezept, dass man einfach kopieren

CPPFLAGS := -DNDEBUG 
CFLAGS := -Wall -g -Wextra $(OPTFLAGS) 

sources := $(wildcard src/*.c) 
objects := $(sources:src/%.c=obj/%.o) 

.PHONY: all 
all: bin/ex 
bin/ex: CFLAGS += -fPIC 
bin/ex: $(objects) 
    $(LINK.o) $^ $(LDLIBS) -o [email protected] 
$(objects): obj/%.o: src/%.c 
    $(COMPILE.c) $(OUTPUT_OPTION) $<