Ich habe die folgende Verzeichnisstruktur für ein dummy C-Projekt.Generic Makefile Build-Verzeichnis Fehler
.
├── inc
│ ├── getmsg.c
│ └── getmsg.h
├── makefile
└── src
└── main.c
Mein aktueller generic Makefile unten ist,
TARGET = main
# finds all .c files, inc/getmsg.c src/main.c
SOURCES := $(shell find * -name *.c)
# converts all .c files to .o files, inc/getmsg.o src/main.o
OBJECTS := $(SOURCES:.c=.o)
# directories that contain .h files for gcc -I flag, inc/
HEADERS := $(dir $(shell find * -name *.h))
CC = gcc
CFLAGS = -Wall -std=c99 -iquote "$(HEADERS)"
all: $(TARGET)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o [email protected]
$(TARGET): $(OBJECTS)
$(CC) -o [email protected] $^
clean:
rm -rf $(shell find * -name *.o) $(TARGET)
Das alles aber fein kompiliert es nur um die .o-Dateien in das gleiche Verzeichnis Dumps wie seine entsprechende C-Datei.
Ich möchte alle Objektdateien in einem Build-Verzeichnis abgelegt haben. Um dies zu tun, ändere ich die OBJECTS
zu OBJECTS := $(patsubst %,build/%,$(notdir $(SOURCES:.c=.o)))
, die die Dateien build/getmsg.o build/main.o
listet. Dann setze ich das %.o
Ziel auf build/%.o: %.c
.
Dies gibt jedoch No rule to make target 'build/getmsg.o'
zurück. Daher kann die make-Datei die .o-Dateien nicht erstellen. Was fehlt mir hier?
Dubletten Ändern http://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different-directory -than-src –
Mögliches Duplikat von [GNU Make-Muster zum Erstellen von Ausgaben in einem anderen Verzeichnis als src] (http://stackoverflow.com/questions/13552575/gnu-make-pattern-to-build-output-in-different-en- verzeichnis-als-src) –