www.mikrocontroller.net

Forum: Compiler & IDEs cmd: make - no rule to make target main.elf


Autor: Moritz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe wie andere auch das make Problem. habe mich an das Tutorial 
gehalten, dortiges makefile benutzt.
Anders als bei den anderen brichts nicht bei .o sondern bei .elf ab.

Nun hab ich mal "make -d" gemacht, und sehr merkwürdiges rausbekommen. 
Irgendwie scheint es zu glauben das Target sei makefile im 
erstenschritt, und dann erst main. Dann jeweils scheints zu glauben das 
Target hieße main.elf.xyz mit xyz = alle möglichen source-endungen wie 
.c, .o, etc.

Dann spricht es davon, "target file sizebefore.." "build" "elf" sich 
vorzunehmen, aber dann nicht zu finden. sollten diese schlüsselwörter 
nicht von make ersetzt werden?

Nochmal zum grundlegenden verständnis, das im Tutorial erwähnte makefile 
ist Einsatzbereit?

im Anhang debug-Ausgabe.
Makefile 1:1 wie im Artikel 
http://www.mikrocontroller.net/articles/Beispiel_Makefile (Beispiel 1)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte poste noch einmal exakt dein Makefile, damit man damit mal
was testen kann.  Bitte nicht inline, bereits copy&paste kann
Fehler verursachen, sondern als Anhang.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jörg:

Nun, vermutlich ist das genau sein Makefile. ;-)


@ Moritz:

> Nochmal zum grundlegenden verständnis, das im Tutorial erwähnte makefile
> ist Einsatzbereit?

Wenn deine C-Datei main.c heißt, dann ja. Heißt sie bei dir aber 
anscheinend nicht, also musst du das Makefile etwas anpassen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:

> Nun, vermutlich ist das genau sein Makefile. ;-)

Ich fürchte halt, dass da in dem Makefile selbst was schief gegangen
ist.  Schließlich behauptet es ja nicht, dass es irgendwelche Dateien
nicht finden würde, sondern dass es keine Regel gäbe, die main.elf
zum Ziel hat.  Wenn ich mir das Makefile aus dem Download-Link im
Wiki aber nehme, dann ist diese Regel tatsächlich vorhanden, und
entsprechend verhält sich make bei seinem Aufruf auch.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:

> Wenn ich mir das Makefile aus dem Download-Link im
> Wiki aber nehme, dann ist diese Regel tatsächlich vorhanden, und
> entsprechend verhält sich make bei seinem Aufruf auch.

Wenn ich das Makefile aus dem Link nehme und es kein main.c gibt, kommt 
genau die obige Fehlermeldung. Mit main.c funktioniert es tadellos.
Aber warum genau diese Fehlermeldung kommt, erschließt sich mir auch 
gerade nicht.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:

> Wenn ich das Makefile aus dem Link nehme und es kein main.c gibt, kommt
> genau die obige Fehlermeldung.

Seltsam.  Ich bekomme dann:
make: *** No rule to make target `main.c', needed by `main.o'.  Stop.

Egal, ob ich das in einer Unix-Shell mache oder in der Msys-Shell
oder in cmd.exe.  Einziger Unterschied, den ich so sehe: meine
makes sind alle noch 3.80, nicht 3.81.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:

> Seltsam.  Ich bekomme dann:
>
>
make: *** No rule to make target `main.c', needed by `main.o'.
> Stop.

Ist das Directory bei dir denn "clean"? Ich bekomme deine Fehlermeldung 
dann, wenn es mal ein main.c gegeben hat, und das dep-File noch 
existiert.

> Egal, ob ich das in einer Unix-Shell mache oder in der Msys-Shell
> oder in cmd.exe.  Einziger Unterschied, den ich so sehe: meine
> makes sind alle noch 3.80, nicht 3.81.

Bei mir ist es 3.81 in cmd.exe. Was anderes kann ich im Augenblick nicht 
ausprobieren, da ich unterwegs bin und nichts anderes auf dem Laptop 
habe.

Autor: Moritz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Frisch aus meinem sample\hellow Verzeichniss. Beim ersten Post hats mir 
irgendwie nur eine Datei anzuhängen erlaubt.

Die Datei heißt main.c , kleingeschrieben. Das Makefile habe ich sowohl 
mit großem als auch mit kleinem M versucht.

Was heißt "clean" bezüglich Verzeichnis?

Das ganze läuft übrigens auf NTFS, ich weiß nicht ob die linux-tools 
damit ein Problem haben.

Anhang: C:\winavr\sample\hellow\Makefile

Autor: Moritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal ein dir aus comandline, falls man mir mit main.c nicht 
glauben will ;)


C:\winavr\sample\hellow>dir
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: FCE5-47F3

 Verzeichnis von C:\winavr\sample\hellow

11.11.2008  05:40    <DIR>          .
11.11.2008  05:40    <DIR>          ..
11.11.2008  05:40                89 hellow.pnproj
11.11.2008  05:40                59 hellow.pnps
10.11.2008  20:28               579 main.c
10.11.2008  20:30            16.838 Makefile
               4 Datei(en)         17.565 Bytes
               2 Verzeichnis(se), 39.128.940.544 Bytes frei

C:\winavr\sample\hellow>




Und nur falls es irgendwie Bedeutung hat... main.c:

/* Alle Zeichen zwischen Schrägstrich-Stern
   und Stern-Schrägstrich sind lediglich Kommentare */

// Zeilenkommentare sind ebenfalls möglich
// alle auf die beiden Schrägstriche folgenden
// Zeichen einer Zeile sind Kommentar

#include <avr/io.h>          // (1)

int main (void) {            // (2)

   DDRB  = 0xff;             // (3)
   PORTB = 0x03;             // (4)

   while(1) {                // (5a)
     /* "leere" Schleife*/;  // (5b)
   }                         // (5c)

   /* wird nie erreicht */
   return 0;                 // (6)
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:

> Ist das Directory bei dir denn "clean"? Ich bekomme deine Fehlermeldung
> dann, wenn es mal ein main.c gegeben hat, und das dep-File noch
> existiert.

OK, hast Recht.  .dep hatte ich vergessen.  Wenn ich das wegräume,
sieht es aber immer noch vernünftig aus:
make: *** No rule to make target `main.o', needed by `main.elf'.  Stop.

Autor: Moritz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal make -p gemacht, herauskommt eine Ellenlange Liste die mir 
als noob überhaupt nix sagt. Aber vielleicht gibts hier ein paar cracks 
die mit einem Blick die Diagnose schaffen? Übrigens diesmal Make 3.80, 
bringt aber selben Fehler.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Du benutzt ein komplett anderes Makefile als ich, das sagen mir bereits
die völlig unterschiedlichen Zeilennummern in diesem Text.  Da du deins
nicht anhängst, hier nochmal das, was ich aus der Wiki-Seite habe.

Autor: Moritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch ich habs doch angehängt, 5 Posts weiter oben...

Autor: Moritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus welchem Wiki meinst du hast du es her? Also es ist anders als jene 
vom hiesigen Artikel meines ersten Posts. Was mir auf den ersten Blick 
an unterschied auffällt sind die Verzeichnis Definitionen die bei meiner 
Version fehlen... Aber es sollte ja trotzdem funktionieren, da ich make 
im Verzeichnis des Makefiles aufrief?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moritz wrote:
> Doch ich habs doch angehängt, 5 Posts weiter oben...

Sorry, hatte ich übersehen.  Ja, das Teil ist komplett kaputt.
Beispielsweise das, was zu besagtem Fehler führt:
# Link: create ELF output file from object files.
        .SECONDARY : $(TARGET).elf
        .PRECIOUS : $(OBJ)
        %.elf: $(OBJ)
        @echo
        @echo $(MSG_LINKING) $@
        $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)

Nun vergleich das mal mit dem, wie es sein sollte:
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
        @echo
        @echo $(MSG_LINKING) $@
        $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)

Dummerweise sind führende (hard!) TABs für ein Makefile von grund-
legender Bedeutung.

Vielleicht nimmst du ja doch einfach das mfile-Tool.

Autor: Moritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tatsache... es funktioniert! offenbar habe ich immer mit der Copy n 
Paste Version vom Artikel gearbeitet, das hätte ich mir eigentlich auch 
denken können. Jetzt tuts auch in PN. Danke Jörg! Sollte man vielleicht 
eine Warnung für ähnlich unbedarfte im Artikel vermerken, das Copy&Paste 
zu unterlassen ist?

Autor: Moritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(wenn man stattdessen den Link benutzt mit speichern unter kommt das 
saubere Makefile an)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moritz wrote:
> Sollte man vielleicht
> eine Warnung für ähnlich unbedarfte im Artikel vermerken, das Copy&Paste
> zu unterlassen ist?

Nun, es ist ein Wiki, hättest du also auch gleich selbst ändern
können.  Ich habe eine Bemerkung hinzu gefügt.

Autor: Moritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werde ich nächstes mal machen, danke nochmal für deine Hilfe!

Autor: Christian Funke (funke)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich greif den Thread hier mal auf, da ich das selbe Problem hab. Ich 
finde ich hab alles richtig gemacht. Makefile mit großem M, main.c klein 
geschrieben usw. main.c ist ok, das Makefile sollte auch in Ordnung 
sein.
Zuerst schreibe ich, zur Sicherheit, "make clean" und dann "make all" in 
di DOS-Box.
Aber irgendwie bekomme ich immer die Fehlermeldung:
make: *** No rule to make target 'main.elf', needed by elf. Stop.
Im Anhang ist mein Makefile. Hoffe mir kann jemand weiterhelfen.

Autor: Christian Funke (funke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, hat sich erledigt. Die Hektik war mein Feind. Hab im Makefile 
STK500v2 angegeben anstatt STK500. Jetzt läufts. Trotzdem danke

Beitrag #3466249 wurde vom Autor gelöscht.
Autor: F. Fo (foldi)
Datum:
Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Du benutzt ein komplett anderes Makefile als ich, das sagen mir bereits
> die völlig unterschiedlichen Zeilennummern in diesem Text.  Da du deins
> nicht anhängst, hier nochmal das, was ich aus der Wiki-Seite habe.

Dann vermutlich die 100 000senste.
Bei mir klappt das auch nicht.
Habe jetzt das Makefile von Jörg genommen, andere Fehler schon beseitigt 
und den Makefile Generator von Jörg genommen.
Zunächst hatte ich auch das schon vorhandene Template genommen, zuletzt 
den Anhang hier: aber immer noch "no Rule to make main.elf"
Win 8, liegt es vielleicht daran?
Order hat Vollzugriff, alle anderen Hinweise habe ich auch beachtet 
(hoffe ich doch).
Aktuelle (Test) files habe ich angehängt.

Ach ja, frohes neues...

... und danke!

Autor: F. Fo (foldi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Hinweise aus dem Winavr Totorial 
(http://www.mikrocontroller.net/articles/WinAVR) habe ich befolgt, auch 
einige andere Sachen, die hier empfohlen wurden.
Mit dem Generator von Jörg Wunsch ist das ja eigentlich ein Kinderspiel 
(vielen Dank hier noch mal an Jörg für dieses tolle Teil).
Vielleicht hängt es mit dem Windows8 zusammen.
Hab leider nur noch Win8 und meinen Laptop mit Atmel Studio muss ich 
wohl erst mal in die Garantiereparatur geben. Hab dann nur noch ein 
Netbook.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
# Target file name (without extension).
TARGET = main


# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c  C/A/main.c
                   ^^^^^^^^^^
Was soll das darstellen?

Autor: F. Fo (foldi)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> # Target file name (without extension).
> TARGET = main
>
> # List C source files here. (C dependencies are automatically
> generated.)
> SRC = $(TARGET).c  C/A/main.c
>                    ^^^^^^^^^^Was soll das darstellen?

Hab ich ins Verzeichnis A gepackt. Der Doppelpunkt ist weg, weil sonst 
auch Mecker von Make gab.

Der "Wunsch Generator" hat das Source mit Doppelpunkt übernommen, was 
aber zu Fehler 533 führte.

: Bearbeitet durch User
Autor: F. Fo (foldi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermute schon fast, dass es am Win8 liegt. Den Ordner habe ich, weil ich 
schon etwas in dieser Richtung las, mit Vollzugriff an "jeder" frei 
gegeben.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
F. Fo schrieb:
> Hab ich ins Verzeichnis A gepackt. Der Doppelpunkt ist weg, weil sonst
> auch Mecker von Make gab.

Packe es nicht irgendwo hin, sondern in den selben Ordner wie das 
Makefile, und arbeite dann ohne Pfade.

Außerdem ist es ziemlich sinnlos, main.c gleich doppelt in der SRC-Liste 
zu haben.

Autor: F. Fo (foldi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Packe es nicht irgendwo hin, sondern in den selben Ordner wie das
> Makefile, und arbeite dann ohne Pfade.

Hallo Stefan,

vielen Dank!
Das war schon mal ein "ziemlich weiter Bringer". Sind noch Fehler, aber 
ich taste mich vor.
:-)

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.