Forum: Mikrocontroller und Digitale Elektronik make.exe: *** No rule to make target...nichts Hilft!!!!!


von hinkebäi (Gast)


Lesenswert?

Hi,

Ich habe folgendes Problem:

make.exe: *** No rule to make target `C:/Dokumente', needed by
`main.elf'.  Stop.

Das Problem wird ja in vielen Foren behandelt, aber ich habe keinen
Ansatz gefunden, der mein Problem löst.

Meiner Ansicht nach müsste es in folgender Rheienfolge ablaufen:

1. Sourcecode in PN schreiben und unter testordner\test.c abspeichern
2. \WinAVRalt\mfile\makefile_template auch nach testordner\
kopieren
3. makefile_template umbenennen in Makefile
4. Makefile mit mfile editieren:MCU Type auswählen...C-Sourcefile ohne
Endung auswählen
5. In PN Sourcecode laden und [WinAVR] Make all wählen

Aber genau so geht es eben nicht. Ich habe schon so einiges
ausprobiert. Kann mir jemand helfen?

Danke!!

hinkebäi

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Verwende einen Pfad ohne Leerzeichen.

"c:\dokumente und einstellungen\hurbelgnurbel\bla\fusel.c"

enthält ein Leerzeichen, und das wird von make wie von Dir angegeben
ausgewertet, nämlich als "c:\dokumente".

von Rolf Magnus (Gast)


Lesenswert?

> make.exe: *** No rule to make target `C:/Dokumente', needed by
> `main.elf'.  Stop.

Sieht nach einem typischen Problem mit nicht korrekt gehandhabten
Leerzeichen in Dateinamen aus. Das wäre bestimmt nach "Dokumente"
noch weitergegangen. Gab's da nicht unter Windows dieses Verzeichnis
namens "Dokumente und Einstellungen" oder so?

von hinkebäi (Gast)


Lesenswert?

Danke für den Tipp. Das habe ich aber auch schon ausprobiert.
Mit folgender Verzeichnisstruktur funktioniert es auf jedenfall nicht
und da hat man ja keine spaces in den Namen.


C:\ordner>dir
 Datenträger in Laufwerk C: ist System
 Volumeseriennummer: 486F-15DA

 Verzeichnis von C:\ordner

13.04.2006  10:11    <DIR>          .
13.04.2006  10:11    <DIR>          ..
13.04.2006  10:11    <DIR>          .dep
13.04.2006  10:11            14'116 Makefile
13.04.2006  10:10            14'114 Makefile.bak
12.04.2006  22:27               135 test.c
               3 Datei(en)         28'365 Bytes
               3 Verzeichnis(se),  6'335'885'312 Bytes frei

Ich frage mich wie make.exe wissen soll, wo sich das makefile
befindet??!!

Gibt es sonst nocht etwas, das man probieren kann.

von Stefan (Gast)


Lesenswert?

Man kann probieren das Makefile zu lesen und zu verstehen, wieso make
meint, es müsste ein Target C:/Dokumente machen.

von Rolf Magnus (Gast)


Lesenswert?

> Mit folgender Verzeichnisstruktur funktioniert es auf jedenfall
> nicht und da hat man ja keine spaces in den Namen.

Vermutlich wird im Makefile immernoch ein solches Verzeichnis
eingetragen sein.

> Ich frage mich wie make.exe wissen soll, wo sich das makefile
> befindet??!!

Wenn du nix anderes angibst, sucht es im aktuellen Verzeichnis.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mir schwant böses ...


Wie bitte rufst Du make auf? Per Doppeklick im Explorer?!

Das geht naturgemäß in die Hose.

Korrekt ist:

Start->Ausführen->Cmd.exe

in das dann erscheinende Fenster folgendes eintippen:

  cd \ordner (enter)

  make (enter)

Statt "(enter)" natürlich die entsprechende Taste auf der Tastatur
drücken :-)

von Reiner (Gast)


Lesenswert?

Und daran denken, daß make "case sensitive" ist.
"Test.c" ist nicht gleich "test.c" und "Makefile" ist nicht
gleich "makefile"!

Reiner

von hinkebäi (Gast)


Lesenswert?

Vielen Dank für deinen Tipp.Leider hat es nichts genützt. Hast du noch
eine Idee?

Danke

D:\>cd test

D:\test>dir
 Datenträger in Laufwerk D: ist Daten
 Volumeseriennummer: A889-6990

 Verzeichnis von D:\test

13.04.2006  16:17    <DIR>          .
13.04.2006  16:17    <DIR>          ..
13.04.2006  10:08    <DIR>          .dep
15.02.2005  19:38           153'600 make.exe
13.04.2006  10:10            14'114 Makefile
13.04.2006  10:08            14'112 Makefile.bak
12.04.2006  22:27               135 test.c
               4 Datei(en)        181'961 Bytes
               3 Verzeichnis(se), 10'569'564'160 Bytes frei

D:\test>make all

-------- begin --------
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.

make: *** No rule to make target `main.o', needed by `main.elf'.
Stop.

von mthomas (Gast)


Lesenswert?

s/TARGET=main/TARGET=test

von Werner A. (Gast)


Lesenswert?

poste dochmal dein makefile. Wahrscheinlich hast Du Leerzeichen anstelle
von Tabulatoren drin.

Werner

von Wolfram (Gast)


Lesenswert?

>s/TARGET=main/TARGET=test

oder deutlicher dein Programm heisst test.c
im Makefile hast du aber als TARGET wahrscheinlich main.c angegeben.

von hinkebäi (Gast)


Angehängte Dateien:

Lesenswert?

Das hat leider wieder nicht funktioniert. Mein Makefile ist im
Dateianhang. Wäre schön, wenn due Zeit finden würdest, es die schnell
anzuschauen.

Hier noch den Inhalt des Ordners, der alle meine Files beinhaltet:

D:\test>dir
 Datenträger in Laufwerk D: ist Daten
 Volumeseriennummer: A889-6990

 Verzeichnis von D:\test

13.04.2006  18:37    <DIR>          .
13.04.2006  18:37    <DIR>          ..
13.04.2006  10:08    <DIR>          .dep
15.02.2005  19:38           153'600 make.exe
13.04.2006  18:37            14'112 makefile
03.02.2005  23:24            13'589 makefile.bak
12.04.2006  22:27               135 test.c
               4 Datei(en)        181'436 Bytes
               3 Verzeichnis(se), 10'569'490'432 Bytes frei
















Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\>cd test
Das System kann den angegebenen Pfad nicht finden.

C:\>d:

D:\>test

D:\>dir
 Datenträger in Laufwerk D: ist Daten
 Volumeseriennummer: A889-6990

 Verzeichnis von D:\

02.03.2006  22:57    <DIR>          Bilder
12.04.2006  20:12    <DIR>          divFiles
12.04.2006  21:59    <DIR>          divProgramme
12.04.2006  20:12    <DIR>          filme
12.04.2006  21:54    <DIR>          Installationsfiles
20.01.2006  15:33    <DIR>          Musik
19.01.2006  23:42    <DIR>          rfn
28.02.2006  13:13    <DIR>          SPIELE
26.02.2006  19:58    <DIR>          temp
13.04.2006  18:37    <DIR>          test
19.01.2006  22:27    <DIR>          treiber
19.01.2006  23:37    <DIR>          zhwin
               0 Datei(en)              0 Bytes
              12 Verzeichnis(se), 10'569'490'432 Bytes frei

D:\>ccd test
Der Befehl "ccd" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

D:\>cd test

D:\test>dir
 Datenträger in Laufwerk D: ist Daten
 Volumeseriennummer: A889-6990

 Verzeichnis von D:\test

13.04.2006  18:37    <DIR>          .
13.04.2006  18:37    <DIR>          ..
13.04.2006  10:08    <DIR>          .dep
15.02.2005  19:38           153'600 make.exe
13.04.2006  18:37            14'112 makefile
03.02.2005  23:24            13'589 makefile.bak
12.04.2006  22:27               135 test.c
               4 Datei(en)        181'436 Bytes
               3 Verzeichnis(se), 10'569'490'432 Bytes frei


D:\test>make all s/TARGET=main /TARGET=test

-------- begin --------
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.

make: *** No rule to make target `main.o', needed by `main.elf'.
Stop.

D:\test>

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Im Makefile steht

  TARGET = main

Also muss Deine Quelltextdatei auch so heißen.

Benenne test.c um in main.c

Oder ändere den Eintrag im Makefile.


Liest Du eigentlich, was man Dir hier rät? Ich bin damit nämlich nicht
der erste ...

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


Lesenswert?

Hallo,
ich habe dasselbe Problem.
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.


Was soll ich tun?

Danke
MfG
Christian

von Karl H. (kbuchegg)


Lesenswert?

Guy Ngamy schrieb:

> (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.


Na, komm. So schwer ist das auch wieder nicht zu erraten.

Da steht

SRC = $(TARGET).c timerInit.c

Das $(TARGET) sieht irgendwie 'eigen' aus. Gar nicht so, wie sonst 
Dateinamen aussehen. Zusammen mit
TARGET = uC_FG
liegt der Schluss recht nahe, dass es sich dabei um eine Ersetzung oder 
so handelt. d.h. der Text '$(TARGET)' wird durch 'uC_FG' ersetzt.
Macht man das mal probehalber (um zu sehen, was dann rauskommt), dann 
steht da

SRC = uC_FG.c timerInit.c

So. Wonach sieht das aus?
Das sieht so aus, als ob da einfach alle Files der Reihe nach, durch 
Leerzeichen getrennt, angeführt werden. Das erste File ist durch einen 
Makro-Mechanismus eingesetzt worden, weil es wohl im Regelfall so ist, 
dass das Programm erst mal genau so heißen soll, wie das 'Hauptfile', 
wenn es nur ein einziges Hauptfile gibt. Und damit man bei einem 
derartigen Makefile den Programmanamen nicht an 25 Stellen im Makefile 
ändern muss, wird dieser spezielle Name vorgezogen, mittels einem Makro 
benannt

TARGET = meinProgramm

und anstelle des eigentlichen Namens kann man dann überall $(TARGET) 
benutzen, wodurch man nur mehr an einer Stelle im Makefile anpassen 
muss, wenn man das Makefile ins nächste Projekt weiterkopiert und 
weiterbenutzt. Macht Sinn.

> 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

Wie du da auf die Idee kommst, du bräuchtest irgendwelche / und weitere 
$(TARGET) erschliesst sich mir nicht wirklich.
Naheliegend wäre das zu benutzen, was weiter oben durch betrachten des 
Vorhandenen geraten wurde: Einfach alle Files der Reihe nach, mit einem 
Leerzeichen getrennt, anführen.

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

Macht auch irgendwie Sinn. Denn Programmierer sind faule Hunde, die es 
gerne haben, wenn die Dinge einfach sind. Und noch einfacher geht ja 
wohl kaum mehr.

> Was soll ich tun?

Ein bischen besser analysieren, was du in den Vorgaben siehst und 
überlegen welche Schlussfolgerungen logischen Sinn ergeben und welche 
nicht. Und nicht einfach nur irgendwie abmalen.

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

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.