1) Ich habe ein Verzeichnis namens dir, und die Unterverzeichnisse sind sub1, sub2, sub3.
2) Ich möchte eine Makefile erstellen, die alle Quellen im Unterverzeichnis kompiliert. Dies sind einige Zeilen meiner Makefile.
CFLAGS = -I/usr/include/ -I./ -ansi -g
GPROF_CFLAGS = -I/usr/include/ -I./
VPATH = ./sub1 ./sub2 ./sub3
SRCS := $(wildcard *.c)
OBJS=$(SRCS:.c=.o)
exe: $(OBJS)
$(CC) $(LFLAG) -o exe $(CFLAGS) $(OBJS) -lm
exe_gprof:
gcc $(LFLAG) -o exe $(GPROF_SUFFIX) $(GPROF_CFLAGS) $(SRCS)
clean:
rm -f *.o
clean_all: clean
rm -f exe exe$(GPROF_SUFFIX) gmon.out Simfir000.stat rm -f *.o.
3) Diese Makefile funktioniert einwandfrei, wenn ich nur den Unterordner sub habe (dieser Ordner enthält alle Quelldateien) und keinen anderen Unterordner habe. (d. h. in der Makefile vpath=./sub).
4) Wenn es Unterordner wie in Punkt 1 gibt, befindet sich die Hauptdatei im Unterordner sub1/src/main.c (d. h. Unterordner innerhalb des Unterordners). Wenn ich versuche zu kompilieren, wird ein undefinierter Verweis auf main angezeigt.
5) Welche Änderung muss ich vornehmen, um dies erfolgreich zu kompilieren? Können wir mehr als ein Verzeichnispfad in vpath angeben?
Gesamtkarte ist:
Verzeichnis namens dir
Unterverzeichnis dir/sub1
dir/sub2
dir/sub3
Hauptdatei befindet sich in dir/sub1/src/main.c
Meine zweite Frage ist
Wenn ich Verzeichnis für Verzeichnis ausführen und verschiedene exe's erstellen möchte
Nur sub1 kompilieren und sub1exe erstellen
Nur sub2 kompilieren und sub2exe erstellen.
Die Makefile wird sein
CFLAGS = -I/usr/include/ -I./ -ansi -g
GPROF_CFLAGS = -I/usr/include/ -I./
VPATH = ./sub1 ./sub2 ./sub3
SRCS1 := $(wildcard *.c)
SRCS2 := $(wildcard *.c)
OBJS=$(SRCS:.c=.o)
exe1: $(OBJS)
$(CC) $(LFLAG) -o exe1 $(CFLAGS) $(OBJS) -lm
exe2: $(OBJS)
$(CC) $(LFLAG) -o exe2 $(CFLAGS) $(OBJS) -lm
exe1_gprof:
gcc $(LFLAG) -o exe1 $(GPROF_SUFFIX) $(GPROF_CFLAGS) $(SRCS1)
exe2_gprof:
gcc $(LFLAG) -o exe2 $(GPROF_SUFFIX) $(GPROF_CFLAGS) $(SRCS2)
clean:
rm -f *.o
clean_all: clean
Welche Änderungen muss ich anstelle von $(wildcard *.c) vornehmen.