gnu gcc makefile

Gast #816982
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!
Gast
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.
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.
Gast
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 $@
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.
Gast
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.