2 Stimmen

Verwendung von vpath und Platzhalter in der Makefile

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.

1voto

yegorich Punkte 4503

Dieser Beitrag scheint Ihre Frage zu beantworten: Quellen aus Unterverzeichnissen in Makefile

Versuchen Sie SRCS = $(wildcard *.c) $(wildcard **/*.c)

Ich glaube, VPATH und wildcard funktionieren nicht zusammen, sodass Ihre SRCS nicht alle Quelldateien enthält.

Haben Sie übrigens schon CMake ausprobiert?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X