Makefile Syntax

OP (Firma: Student) #2812040
Lesenswert?

Hallo,
ich will im Makefile alle source files in SRC eingeben. ich weiß aber 
nicht, was die Syntax ist. ich habe folgenden Code geschrieben. es 
funktionniert aber nicht. ich will 3 Dateien eingeben.

# List C source files here. (C dependencies are automatically 
generated.)
SRC += $(TARGET).c timerInit.c\$(TARGET).c inb_lcd_4Zeilen.c\$(TARGET).c 
keypad_lcd.c


Die Dateien sind:
timerInit.c
inb_lcd_4Zeilen.c
keypad_lcd.c


ich hoffe Sie mein Problem verstehen, und, dass Sie mir etwas 
vorschalgen könnten.

Mit freundlichen Grüßen
Christian
#2812073
Lesenswert?

Hallo Christian,

ganz so einfach funktioniert das nicht.

Ein Makefile dient dazu, die Abhängigkeiten zwischen Dateien so 
darzustellen, daß das Make-Tool sie ausführen kann. Die Syntax ist nicht 
trivial und außerdem gibt es viele Unterschiede zwischen verschiedenen 
Make-Varianten, darum ist es nicht einfach, Dir hier "freihändig" einen 
vernünftigen Rat zu geben.

Der Ausschnitt aus dem Makefile, den Du gepostet hast, soll offenbar 
Dateien zu einer Umgebungsvariable namens SRC hinzufügen. Wahrscheinlich 
ist dieses Makefile in irgendein komplexeres Makefile-System 
eingebunden, wie es manche Entwicklungsumgebungen haben, z. B. die von 
QNX, und wo SRC dann ausgewertet wird.

Vermutlich muß das so lauten:
SRC += timerInit.c inb_lcd_4Zeilen.c keypad_lcd.c

Es kann sein, daß da noch ein Pfad fehlt, also
SRC += $(SRCDIR)/timerInit.c $(SRCDIR)/inb_lcd_4Zeilen.c \
$(SRCDIR)/keypad_lcd.c
oder so ähnlich. Wie genau die Environmentvariable heißt, hängt von 
Deiner konkreten Umgebung ab. Du kannst auch für den Anfang absolute 
Pfade nehme, vielleicht brauchst Du es auch nicht, falls die 
Quellcodedateien direkt im Projektverzeichnis stehen.

Ich würde als Pfadtrenner Vorwärtsstriche verwenden, da 
Windows-Entwicklungsumgebungen damit meistens klarkommen und 
ursprünglich von UNIX-Systemen stammende Entwicklungssysteme das meist 
auch unter Windows brauchen.

Du darfst in Dateilisten keine Zeilenumbrüche verwenden oder mußt am 
Ende der Zeile einen Backslash als Markierung, daß die Zeile fortgesetzt 
wird, verwenden. Dein Beispiel ist also auf jeden Fall falsch, falls es 
nicht das Forensystem war, das da einen Umbruch eingefügt hat.

Eine andere häufige Falle (die mit Deinem konkreten Problem im Moment 
nichts zu tun hat): Wenn Du Regeln und Abhängigkeiten definierst, dann 
müssen die Einrückungen untergeordneter Zeilen bei vielen 
make-Programmen mit echten Tab-Zeichen, nicht mit Leerzeichen erfolgen. 
Es gibt Texteditoren, die den Unterschied anzeigen können oder das 
automatisch machen.

Ich hoffe, es bringt Dich weiter. Wenn nicht, dann bleibt Dir nichts 
anderes übrig, als Dich mal in die Feinheiten von makefile-Syntax 
einzulesen und, soweit in Deinem Entwicklungssystem möglich, 
Debugausgaben einzubauen ("echo $(SRC)" oder so), um herauszubekommen, 
wo etwas falsch eingebunden wird.

Viel Erfolg!

Tschüß, Matthias
OP (Firma: Student) #2812322
Lesenswert?

Danke! es funktionniert aber nicht.
ich habe eine Datei "timerInit.c und timerInit.h" im Projekt importiert
(uC_FG heißt das Projekt) und im Makefile habe ich Folgenden
geschrieben:
...
TARGET = uC_FG
...
SRC = $(TARGET).c timerInit.c
...

und es funktionniert.

wenn ich aber mehrere Dateien importiere:
inb_lcd_4Zeilen.c und inb_lcd_4Zeilen.h
keypad_lcd.c und keypad_lcd.h
timerInit.c und timerInit.h

dann funktionniert es nicht. Ich vermute ich sollte etwas bei SRC ändern
aber die Syntax könne ich nicht. ich habe mit folgender Änderung
probiert, funktionniert aber nicht:
SRC += $(TARGET).c timerInit.c/$(TARGET).c inb_lcd_4Zeilen.c/$(TARGET).c
keypad_lcd.c

ERROR:
make: Leaving directory
`C:/Users/HP_Advanced/Documents/ArbeitsordnerChristian/testprogramme/uC_
FG/uC_FG'
    make: *** No rule to make target `uC_FG/TARGET', needed by `elf'.
Stop.


und wenn ich mit folgendem Code probiere:
C_SRCS +=  \
inb_lcd_4Zeilen.c \
keypad_lcd.c \
timerInit.c

dann habe ich dise Fehlermeldung:
undefined reference to `main'

Was soll ich tun? Anhang das Makefile

Danke
MfG
Christian
Angehängte Dateien:
Moderator #2812387
Lesenswert?

Hab's nicht getestet, aber naheliegend wäre doch ganz einfach
1
SRC = $(TARGET).c timerInit.c inb_lcd_4Zeilen.c keypad_lcd.c

bzw.
1
SRC = $(TARGET).c
2
SRC += timerInit.c inb_lcd_4Zeilen.c keypad_lcd.c

Beide Varianten tun das Gleiche.

Ich gehe dabei davon aus, dass es eine Datei uC_FG.c gibt, die das
Hauptprogramm main enthält.
OP (Firma: Student) #2812459
Lesenswert?

Ja entschuldigung. Es hat mir so aufgefallen als ob keiner bei dem 
anderen Diskussion antworten würde, weil ich die nicht angefangen habe. 
ich habe dann lieber auch hier geschrieben, da ich die Diskussion hier 
angefangen habe.
Es tut mir wirklich Leid.

Danke für den Hinweis!

MfG
Christian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren