www.mikrocontroller.net

Forum: Compiler & IDEs Komischer Fehler tritt plötzlich beim Kompilieren auf (AVR STUDIO)


Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
Ich hab ein Project im AVR Studio 4 was bisher hervorragend funktioniert 
hat. Es ist eher groß und ich habe nun noch eine zusätliche Header Datei 
hinzugefügt die lediglich eine enum-Deklaration enthält. Zudem habe ich 
diverse Funktionen geändert um diesen neuen variablentyp zu verwenden 
aber ich habe darauf geachtet auch alle Prototypen zu ändern. Ich 
bekomme dennoch einen Fehler:

c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr6\lib 
c.a(cmpsf2.o):  In function `__lesf2':
(.text.fplib+0x0): multiple definition of `__eqsf2'

c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/avr6\libgcc.a(_eq_sf.o):(.te 
xt+0x0):  first defined here
make: *** [Datei.elf] Error 1

Ich habe keine Ahnung woe libc.a herkommt, geschweige denn was da 
überhaupt drinnen ist. Von der Funktion habe ich auch noch nie gehört. 
Wie können ein paar harmlose Änderungen zu so nem beknackten Fehler 
führe? Hat vielleicht einer von euch schonmal diesen Fehler gehabt, und 
kennt dessen Ursache und einen Lösungsweg?

Gruß,
Shibby

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
libc ist die Standard C-Lib die zu jeden Compiler gehört. Dazu gehören 
die ganzen IO-Funktionen wie printf usw.
Eigentlich ist das immer libgcc, aber vielleicht hat sich das bei deiner 
Version geändert. Hast du mal im AVR-GCC Verzeichnis geguckt ob bei da 
drin sind.

Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist alles auf dem neusten Stand. Ich kann mir das immer noch nicht 
erklären, obwohl ich nun zumindest weiß was bei mir die Fehlermeldung 
auslöst. Ich arbeite an einem Taschenrechner und habe eine Funktion die 
die Input String auseinander nimmt und das Ergebnis berechnet. Es unter 
anderem auch eine Funktion die nur dafür zuständig ist gewisse 
mathematische operationen durchzuführen (für Zwischenergebnisse verwende 
ich diese in der erst genannten Funktion). Ich prüfe was für eine 
Operation zu machen ist in einem switch statement. Beispiel:

case Divide:
{
  double param2 = pOperandStack->top();
  pOperandStack->pop();
  double param1 = pOperandStack->top();
  pOperandStack->pop();

  // No divisions by 0.
  if (param2 == 0)
  {
    *pErrorState = 2;
    return 0;
  }

  return param1 / param2;
}

Wenn ich den Teil
  if (param2 == 0)
  {
    *pErrorState = 2;
    return 0;
  }
weglasse funktioniert alles bestens. Mit pErrorState kann ich main() 
mitteilen welche art von Fehler aufgetreten ist (zB Syntax, Math etc.).
Ich hab auchn haufen Warnungen weil ich unbehandelte Fälle in anderen 
Funktionen hab, aber das interessiert mich im Moment nicht, darum kümmer 
ich mich wenn alles andere läuft.
Ich bekomm auch schon nen fehler wenn ich nur sowas leichtes hinzufüge:

  if (param2 == 2)
  {
    return 3;
  }

Egal was fürn Blödsinn...plözlich kommt diese bekloppte Fehlernachricht 
und ich weiß nicht warum, geschweige denn wie ich das Problem lösen 
soll.
Bin über jeglich Hilfe froh :).

Gruß,
Shibby

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche libs linkst du denn dazu?

Oliver

Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin noch ein bischen neu bei der Sache ;). Aber ich gehe zB in AVR 
Studio 4 unter Project -> Configuration Options und dann zum Tab 
"Libraries". Bei dem Fenster "Link with These Objects:" ist alles leer. 
Ich könnte libc.a hinzufügen. Wäre das die Lösung? Ich frage mich WARUM 
dieser Fehler auftritt obwohl ich eigentlich nichts ungewöhnliches 
mache.

Danke für die Schnelle Antwort :)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Mathelib fehlt, und leider fügt das Studio die nicht automatisch 
hinzu.

-lm

Oliver

Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, wie/wo kann ich die hinzufügen? Und warum ist hier die Mathelib 
notwendig. Alles hat funktioniert als es so aussah:

case Divide:
{
  double param2 = pOperandStack->top();
  pOperandStack->pop();
  double param1 = pOperandStack->top();
  pOperandStack->pop();

  return param1 / param2;
}

Danke,
Shibby

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Project -> Configuration Options und dann zum Tab "Libraries"

Da gibt es auch die libm. Die fügst du hinzu.

Oliver

Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, funktioniert!

Shibby

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.