Forum: Mikrocontroller und Digitale Elektronik GCC Compiler erzeugt keine .elf Datei


von Matthias Jung (Gast)


Lesenswert?

Ich programmiere einen Atmel AT90PWM3 mit dem Atmel AVR Studio Version
4.12 und dem GCC Compiler. Ich habe schon ein Programm geschrieben, da
hat alles prima funktioniert. Wenn ich jedoch ein Neues Programm durch
das Programm jage, bekomme ich immer eine Fehlermeldung:

gcc plug-in: Error: Object file not found on expected location
C:\...\Eigene Dateien\Neu_TxD\default\Neu_TxD.elf

Die entsprechende Datei ist auch nicht vorhanden. Compellieren lassen
sich die entsprechenden Programme jedoch fehlerlos. Woran liegt es dass
der Compiler diese .elf Datei nich tmehr erzeugt??

Vielen Dank
Matthias

von Wolfram (Gast)


Lesenswert?

du hast ein Leerzeichen im Pfad!

von Matthias Jung (Gast)


Lesenswert?

Wie meinst du das? ICh habe doch extra einen Unterstrich benutzt. Ich
habe schon 2 Programme im gleichen Ordner, die auch einen Unterstrich
im Namen haben

von Stefan (Gast)


Lesenswert?

Eigene Dateien
      ^

von Matthias Jung (Gast)


Lesenswert?

Das bringt keinen Durchbruch, es kommt immer noch der gleiche Fehler.

von Stefan (Gast)


Lesenswert?

Gibt es eine ausführlichere Fehlermeldung?

Was steht im Makefile bzw. in den vom Makefile aufgerufenen Makerules?


Hast du schon Echo-Ausgaben vor die Toolaufrufe ins Makefile eingefügt,
um Kommandozeilen mitzubekommen?

Hast du schon verbose Ausgaben der Tools angeschaltet, um Include- und
Library-Pfade mitzubekommen?

Hast du schon einen Filemonitor (z.B. FILEMON von www.sysinternals.com)
eingesetzt, um Dateizugriffe generell zu protokollieren?

von ;-) (Gast)


Lesenswert?

Reichen dir nicht auch .zehn Dateien duck und weg ;-)

von Michael (Gast)


Lesenswert?

Habe genau dasselbe Problem, manchmal kommt diese Fehlermeldung die ich
dann nicht mehr weg bekomme, muss dan jedesmal nen neuens Projekt
anlegen. Vorher haben 20 oder mehr Compilerläufe einwandfrei
funktioniert.

von Otto Richter (Gast)


Lesenswert?

Hi da draußen,

hatte den Fehler auch schon oft. 'Mal war er dann wieder weg und dann
'mal wieder da.

Vor 1 Stunde kam er wieder. Nun habe ich folgendes gemacht:  Ich habe
die Änderungen im source rückgängig gemacht, und siehe da, gcc
compilierte ohne Fehlermeldung.

Die Fehlermeldung wird also durch einen Fehler im Quellcode ausgelöst
!!!

Ich hab's dann auch schnell gefunden:

Ich habe in einem file "code_1.c" und einem file "code_2.c" eine
function definiert mit dem gleichen Namen und in "code_2.h" bekannt
gegeben.

Nach Umbenennen einer der beiden functions compilierte gcc wieder ohne
die Fehlermeldung.

Viel Erfolg

Otto

von Michael (Gast)


Lesenswert?

Danke guter Tip, kann den Fehler so auch nachstellen und beheben. Ist ja
dann wohl nen größerer Bug.

von Stefan (Gast)


Lesenswert?

Es ist eher kein "Bug".

Es ist eher ein Problem, dass die Linker Errors (doppeltes Symbol
gefunden) nicht an die IDE durchgereicht werden bzw. dass dem Linker
nachfolgende Tools trotz Linker Error aufgerufen werden.

Das ist eher eine Sache wie man das Makefile aufbaut.

von Matthias Jung (Gast)


Angehängte Dateien:

Lesenswert?

Danke erst mal für die vielen Verbesserungsvorschläge. Bekomme mein
Programmm trotzdem nicht zum laufen. Wie gesagt compellieren lässt es
sich problemlos. Das Problem mit gleich benamten Funktionen ist es bei
mir wohl nicht. Ich muss dazu dagen, dass ich Neueinsteiger was Atmels
betrifft bin. Ich hab mal mein Programm angehängt.

von Matthias Jung (Gast)


Lesenswert?

Ich hab das Problem weiter eingrenzen können. Mein Programm besteht aus
mehreren Programmen. Wenn ich die anderen Dateien nicht einbinde mit:
  #include<"Usart_init.c">
  #include<"put_s.c">
sondern einfach gar nicht, dann funktioniert es. Beim debuggen sieht
man dass er trotzdem ganz brav in die verschiedenen Dateien springt.
Muss man die Dateien nicht einbinden, oder mach ich es einfach falsch?

von Marco S (Gast)


Lesenswert?

Ich kenne eigentlich nur

#include <xy.h>

für die systemdateien oder

#include "myconfig.h"

für meine eigenen Include-Dateien. Vielleicht liegts daran.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Daß 'make' weiterläuft, obwohl ein Fehler in einem Target aufgetreten
ist, könnte daran liegen, daß 'make' mit dem Parameter '-k'
aufgerufen wird...

Prüft das mal in euren Einstellungen zum make-Aufruf.

von Matthias Jung (Gast)


Lesenswert?

Im Klartext, heißt das?: Die Programme, die von zB Main aufgerufen
werden nicht im Main Programm einbinden brauche. Hab ich das richtig
verstanden?

von Tom (Gast)


Lesenswert?

Wenn du die *.c Dateien mit #include einbindest wird der Dateiinhalt an
dieser Stelle eingefügt. Wenn dann die betreffende Datei nochmal
compiliert und gelinkt wird, dann ist der Funktionsname auf einmal
doppelt vorhanden. Kann also der o.g. Linkerfehler sein.

Gruss

von Matthias Jung (Gast)


Lesenswert?

Das leuchtet mir ein. Danke

von Tom (Gast)


Lesenswert?

Zu dem Beitrag oben:
Normalerweise verwendet man dazu Header-Dateien, die nur einen
Funktionsprototyp enthalten. Sonst kann der Compiler die Funktion gar
nicht finden und meckert.
Der Inhalt der Datei put_s.h wäre dann:
void put_s(char *s);

und in main.c oder anderswo, wo die Fkt. put_s() verwendet wird:
#include "put_s.h"

von Matthias Jung (Gast)


Lesenswert?

Das heißt, in der put_s,h steht dann nur:
   void put_s(char *s);
Die Datei put_s.c brauch ich dann weiterhin, nur dass die put_s.h zB in
main eingebunden wird, wie du oben beschrieben hast.

Du sagst, eigentlich, verursache ich wenn ichs nicht mache ernsthafte
Probleme? Durch den Compiler gings ja durch.

von Dirk D. (dirkd)


Lesenswert?

Vielleicht solltest Du erst einmal C-Programmierung auf einem PC lernen
ehe Du mit µC anfängst.

Nicht nur Deine includes sind falsch.

Dein Programm wird auch nicht 123 ausgeben, falls Du das erwarten
sollst. Dein put_s erwartet einen Zeiger auf Character und keinen
char-Wert.

von Matthias Jung (Gast)


Lesenswert?

Da magst du Recht haben. Ich habe jedoch schon C Programme programmiert,
allerdings sind meine Kenntnisse schon ziemlich eingrostet.

Einen Text zu senden würde ich hinbekommen:

char text[] = "BlaBla";
int main()
{
    Usart_init();
    put_s (text);
}
müsste ja dann funktionieren.

Allerdings will ich einen 4 stelligen Zahlenwert, der sich auch ändert
senden.
Kannst du mir da einen Tipp geben? Wär dir sehr dankbar.

von Dirk D. (dirkd)


Lesenswert?

Schau Dir die zur Verfügung stehenden Bibliotheken an. In diesem Fall
die avr-libc.

itoa ist die Funktion, die Du suchst. Oder sprintf falls das zur
Verfügung steht.

von Matthias Jung (Gast)


Lesenswert?

Vielen Dank, dass habe ich gesucht.

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.