Ich habe ein Makefile von einem früheren Projekt genommen, das Programme für einen avr Mikrocontroller kompiliert. Ich stieß auf einige Probleme mit den IO-Ports/Datenrichtungsadressen, die ich einstellte, die den Mikrocontroller dazu veranlassten, Fehler zu verursachen und zurückzusetzen. Aus diesem Grund wollte ich einen Schritt in meinem Makefile hinzufügen, damit es die vorverarbeiteten Dateien erzeugt und dann aus diesen vorverarbeiteten Dateien kompiliert. Ich bin nicht sehr vertraut mit der Funktionsweise von Regeln/Abhängigkeiten in Makefiles, daher habe ich, was ich glaube, einen einfachen Fehler in meinem Verständnis der Funktionsweise von Makefiles gemacht. Meine Regeln, um die vorverarbeiteten Dateien/Objektdateien und eventuell die .elf-Datei zu erstellen, müssen falsch sein. Bis ich die Schritte hinzugefügt habe, die versuchten, die vorverarbeiteten Dateien zu erstellen, die die .elf-Datei erstellen, funktioniert es gut. Was ist mein einfacher Fehler in der Funktionsweise von Regeln/Abhängigkeiten?Wie kann ich einen Schritt in einem Makefile haben, um Vorverarbeitungsdateien zu generieren und aus diesen Dateien zu kompilieren?
Wie ich diese Arbeit sehe, wenn ich nach make all
frage, sieht es, dass es eine Abhängigkeit von led.elf hat. Um dies zu erstellen, hat es die Abhängigkeit der vorverarbeiteten Dateien basierend auf der Zeile $(OUTPUT).elf: $(PROCESS_FILES)
, so dass es mit dieser Zeile beginnt. Wenn ich versuche, make all
jedoch bekomme ich den Fehler make: *** No rule to make target 'main.c', needed by 'main.e'. Stop.
und ich verstehe nicht warum. Kann jemand mein Verständnis in Make-Dateien helfen?
SRC_FILES=\
main.c led.c comm.c
#Object files
PROCESS_FILES=$(SRC_FILES:.c=.e)
OBJ_FILES=$(PROCESS_FILES:.e=.o)
#Directories where to look for include files
INC_DIRS=\
-I. \
#Output file name
OUTPUT=led
#Programmer and port
PROG=dragon_isp
PORT=usb
#Debugging host and port
DHOST=localhost
DPORT=6423
#Compiler related params
MCU=atmega2560
CC=avr-gcc
OBJCOPY=avr-objcopy
CFLAGS= -mcall-prologues -std=gnu99 -funsigned-char -funsigned bitfields \
-fpack-struct -fshort-enums -mmcu=$(MCU) -Wall -Wstrict-prototypes \
$(INC_DIRS)
#Optimization level
CFLAGS+=-Os
#Debug info
CFLAGS+=-gdwarf-2
#Generate hex file ready to upload
all: $(OUTPUT).elf
$(OBJCOPY) -R .eeprom -O ihex $(OUTPUT).elf $(OUTPUT).hex
#Link output files
$(OUTPUT).elf: $(PROCESS_FILES)
$(CC) $(CFLAGS) $(OBJ_FILES) -o $(OUTPUT).elf -Wl,-Map,$(OUTPUT).map
#Create object files
$(PROCESS_FILES): %.e : %.c
$(CC) -E $(CFLAGS) $< -o [email protected]
$(OBJ_FILES): %.o : %.e
$(CC) -x $(CFLAGS) $< -o [email protected]
#Create assembler file of a C source
%.s: %.c
$(CC) -S $(CFLAGS) $< -o [email protected]
#Cleans all generated files
clean:
rm -f $(OBJ_FILES)
rm -f $(OUTPUT).elf
rm -f $(OUTPUT).hex
rm -f $(OUTPUT).map
Edit: Ich bin von meinem Computer jetzt weg, so kann ich dies nicht, aber über meine Frage denke ich beginne ich keine Datei mit dem Namen main.c in diesem Verzeichnis zu denken. Selbst wenn ich das tat, denke ich immer noch, dass das Makefile nicht korrekt funktionieren würde, weil ich Regeln in Makefiles nicht vollständig verstehe.
Der von Ihnen gepostete Fehler besagt, dass Sie 'main.c' nicht finden können, wo sind die Quelldateien relativ zum Makefile? Auch ist nicht klar, warum Sie den zusätzlichen Vorverarbeitungsschritt benötigen, bitte erläutern Sie. – user657267
Ich benutze ein Projekt in einem Unternehmen, wo die Makefiles viel aufwändiger und komplizierter waren. Sie hatten viele Schritte zu ihnen und ein Schritt war, die vorverarbeiteten Dateien zu erstellen, so dass Sie sie überprüfen konnten, wenn Sie wollten. Ich mochte das und ich weiß, dass es möglich ist, also möchte ich es in mein Projekt integrieren. Von jetzt an wäre es nützlich zu sehen, in was für ein spezielles Makro in avr/io.h übersetzt wird. – rangeme