www.mikrocontroller.net

Forum: Compiler & IDEs gnu gcc makefile


Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
langsam funktioniert mein makefile schon recht gut.
Die Source und Include Dateien werden korrekt aus einem Ordener src und 
include ausgelesen und kompiliert.
Wie kann ich aber angeben, das die Objektdateien und das gelinkte 
Programm in ein Ordner bin gepackt wird - und nicht in den Ordner des 
makefiles...



MAIN_OUT = main

all: $(MAIN_OUT)

$(MAIN_OUT): main.o



danke!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem du da "bin/" davorschreibst?

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm, sowas hatte ich auch schon mal ausprobiert..:


------------------------------------

MAIN_OUT = out/main

all: $(MAIN_OUT)

$(MAIN_OUT): out/main.o stm32f10x_it.o  $(LIBPATH)/lib/libstm32.a

------------------------------------
output make:

cs-make all
cs-make: *** No rule to make target `out/main.o', needed by `out/main'. 
Stop.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht denn die Zeile für out/main.o aus?

Autor: Juergen Beisert (jbeisert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal diese Zeile genau an:

$(MAIN_OUT): out/main.o stm32f10x_it.o  $(LIBPATH)/lib/libstm32.a

Expandiert man die Macros steht da:

out/main: out/main.o stm32f10x_it.o [...]

Also hängt das Target "out/main" mindestens von "out/main.o" ab. Und da 
liefert make schon die richtige Information: "No rule to make target 
`out/main.o'"

Du solltest auch angeben, wie denn "out/main.o" erstellt werden soll. 
Derzeit verläßt Du Dich auf die eingebaute Regel, die da lautet:
  %.o:%.c

"make" sucht also nach "out/main.c", um "out/main.o" zu erstellen, 
findet es nicht und jammert rum.

Sag' "make" einfach, wie es "out/main.o" erstellen soll. Ein simples

out/main.o: <woherauchimmer>/main.c

sollte genügen, "make" glücklich zu machen.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so. Daran, daß das schon das ganze Makefile sein könnte, hatte ich 
gar nicht gedacht :-)

> Sag' "make" einfach, wie es "out/main.o" erstellen soll. Ein simples
>
> out/main.o: <woherauchimmer>/main.c
>
> sollte genügen, "make" glücklich zu machen.

Eher nicht, da make dann nur die Abhängigkeit kennt, aber immer noch 
nicht weiß, wie es out/main.o aus main.c erstellen muß. Die eingebaute 
Regel paßt da ja nicht mehr. Man kann aber einfach die ganze Regel 
explizit hinschreiben. Wenn man das dann generisch macht, sieht das etwa 
so aus:

out/%.o: %.c
  $(CC) $(CFLAGS) -c $< -o $@

Autor: Juergen Beisert (jbeisert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus wrote:
> Ach so. Daran, daß das schon das ganze Makefile sein könnte, hatte ich
> gar nicht gedacht :-)
>
>> Sag' "make" einfach, wie es "out/main.o" erstellen soll. Ein simples
>>
>> out/main.o: <woherauchimmer>/main.c
>>
>> sollte genügen, "make" glücklich zu machen.
>
> Eher nicht, da make dann nur die Abhängigkeit kennt, aber immer noch
> nicht weiß, wie es out/main.o aus main.c erstellen muß. Die
> eingebaute Regel paßt da ja nicht mehr.

Stimmt. Ich vergesse immer daß das "Stem" bei "%.o: %.c" und 
"out/main.o" zu "out/main" wird. Und dann passt wieder %.c nicht dazu.

> Man kann aber einfach die ganze Regel explizit hinschreiben.
> Wenn man das dann generisch macht, sieht das etwa so aus:
>
> out/%.o: %.c
>   $(CC) $(CFLAGS) -c $< -o $@

Ja. Leider muß man das dann für alle einzelnen Unterverzeichnisse (wenn 
man mehrere Quellverzeichnisse in ein Ausgabeverzeichnis bauen will) 
einzeln angeben.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dazu gibt's die Variable VPATH. Wenn du z.B. Quellcode-Files in 
Verzeichnissen namens foo und bar stehen hast, schreibst du einfach:

VPATH = foo:bar

vor die Regel, und schon durchsucht make diese beiden Verzeichnisse nach 
der Quellcode-Datei.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.