Ich wollte lernen, wie man ein grundlegendes Makefile für mein Programm erstellt, das 3 Dateien enthält: a.cpp, b.cpp und b.h. Ich schließe b.h in a.cpp ein und rufe eine Funktion auf, die dort deklariert und in b.cpp definiert ist. Ich ging durch mehrere Makefile-Tutorials und kam wie dies mit einem Makefile up:Basic Makefile mit zwei .cpp-Dateien und eine Header-Datei
CC=g++
CFLAGS= -std=c++11 -Wall -pedantic -g
SOURCES= a.cpp b.cpp
DEPS= b.h
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=exec
all: $(EXECUTABLE)
@echo Make has finished.
$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) -o $(EXECUTABLE)
%.o: %.cpp $(DEPS)
$(CC) $(CFLAGS) -c -o [email protected] $<
clean:
$(RM) *.o *~ $(EXECUTABLE)
Allerdings, wenn ich exec machen und führen Sie es wie beabsichtigt funktioniert nicht. Der Compiler gibt keine Warnungen oder Fehler, aber der Funktionsaufruf in a.cpp wird übersprungen, als ob er nicht da wäre. Wenn ich das einfache Programm starte, läuft mein Programm wie beabsichtigt. Offensichtlich mache ich in meinem Makefile nicht gerade etwas richtig, aber ich verstehe nicht was.
Ich verstehe nicht, wie Sie ausführbar, wenn eine der Quelldateien ignoriert wird, wie Sie sagen. Sie sollten entweder einige Compiler/Linker-Fehler erhalten oder die Quelldatei hat keinen beobachtbaren Effekt, oder fehlt mir etwas Offensichtliches? – user463035818
Alles, was mir einfällt, ist, dass vielleicht der Header verlinkt ist, aber die cpp ist irgendwie nicht. Die Existenz der Deklaration verhindert, dass sich der Compiler beschweren kann, aber die Funktion tut nichts, da ihre Definition nicht bekannt ist. –