Forum: Compiler & IDEs gnu gcc makefile


von Alexander (Gast)


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!

von Rolf Magnus (Gast)


Lesenswert?

Indem du da "bin/" davorschreibst?

von Alexander (Gast)


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.

von Rolf Magnus (Gast)


Lesenswert?

Wie sieht denn die Zeile für out/main.o aus?

von Juergen B. (jbeisert)


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.

von Rolf Magnus (Gast)


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 $@

von Juergen B. (jbeisert)


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.

von Rolf Magnus (Gast)


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.

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.