Forum: Compiler & IDEs Makefile Syntax


von Guy N. (Firma: Student) (lechristiano)


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

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

http://mrbook.org/tutorials/make/

...
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
  $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
  $(CC) $(CFLAGS) $< -o $@
...

von Matthias H. (experimentator)


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

von Guy N. (Firma: Student) (lechristiano)


Angehängte Dateien:

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

von Yalu X. (yalu) (Moderator)


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.

von Guy N. (Firma: Student) (lechristiano)


Lesenswert?

danke sehr, bin so froh, es funktionniert mit:
SRC = $(TARGET).c timerInit.c inb_lcd_4Zeilen.c keypad_lcd.c


Gott segnet sie!!!

MfG
Christian

von Karl H. (kbuchegg)


Lesenswert?

Und nächstes mal keine 2 Threads zum gleichen Thema aufmachen. Das wird 
nämlich gar nicht gerne gesehen, weil man im anderen Thread nicht sieht, 
was bereits geantwortet wurde.

von Guy N. (Firma: Student) (lechristiano)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.