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


von Shibby (Gast)


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

von Timmo H. (masterfx)


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.

von Shibby (Gast)


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

von Oliver (Gast)


Lesenswert?

Welche libs linkst du denn dazu?

Oliver

von Shibby (Gast)


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 :)

von Oliver (Gast)


Lesenswert?

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

-lm

Oliver

von Shibby (Gast)


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

von Oliver (Gast)


Lesenswert?

Project -> Configuration Options und dann zum Tab "Libraries"

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

Oliver

von Shibby (Gast)


Lesenswert?

Danke, funktioniert!

Shibby

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.