Forum: Compiler & IDEs Komischer Fehler, wenn die Optimierung auf O0 gestellt wird


von Be M. (bemi)


Lesenswert?

Hi,

ich habe ein kleines Programm. Wenn ich es mit Optimierung kompiliere, 
ist alles ok, aber wenn ich die Optimierung ausschalte -O0, dann erhalte 
ich folgendes.

avr-gcc.exe -mmcu=atmega644  AVRDebug.o AmadeusTraceAVR.o     -o 
AVRDebug.elf
c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\lib 
c.a(fixsfsi.o):  In function `__fixunssfsi':
(.text.fplib+0x0): multiple definition of `__fixsfsi'
c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/avr5\libgcc.a(_sf_to_si.o):( 
.text+0x0):  first defined here
c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\lib 
c.a(fixsfsi.o):  In function `__fixunssfsi':
(.text.fplib+0x0): multiple definition of `__fixunssfsi'
c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/avr5\libgcc.a(_fixunssfsi.o) 
:(.text+0x0):  first defined here
make: *** [AVRDebug.elf] Error 1

und

16-Dec-2007 16:44:50  gcc plug-in: Error: Object file not found on 
expected location E:\Project\PIC Programmer MCU 
SW\AVRDebug\default\AVRDebug.elf

.

Ich habe jetzt herausgefunden, dass der Fehler nur auftritt, wenn ich 
die sin() Funktion verwende. Hat jemand einen Tip, was das sein kann?

Danke,
Bernd

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das Problem und die Lösung ist möglicherweise bekannt, jedenfalls findet 
Goohle die Fehlermeldung *multiple definition of `__fixsfsi* 512 mal im 
WWW.

Zunächst sollte die Mathelibrary mitgelinkt werden (-lm). Genaueres 
müsste dein Makefile hergeben.

Ungewöhnlich ist, dass der Fehler nur bei -O0 auftritt. Kannst du den 
kleinsten, fehlerauslösenden Quelltext bereitstellen?

von Be M. (bemi)


Lesenswert?

Ist eigentlich nicht viel:

[c]
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>
#include "AmadeusTraceAVR.h"

int main() {
volatile  unsigned long i= F_CPU;
  ATInit();
  float a = 3.1415926;
  a = sin (a);

  ATSendString("Als nächstes kommt die Ausgabe eines Float");

    if (ATTraceAllowed()){
      _ATActivate();
        ATSendByte(0x5);
        ATSendByte(0x0e);
        ATSendByte(*((unsigned char*)&a+3));
        ATSendByte(*((unsigned char*)&a+2));
        ATSendByte(*((unsigned char*)&a+1));
        ATSendByte(*((unsigned char*)&a+0));
      _ATMakeTristate();
    }

   return 0;
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das Beispiel ist nicht ausreichend, um den Fehler nachzuvollziehen
1
-------- begin --------
2
avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
3
Copyright (C) 2006 Free Software Foundation, Inc.
4
This is free software; see the source for copying conditions.  There is NO
5
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6
7
8
Compiling C: main.c
9
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o
10
In file included from main.c:2:
11
d:/winavr/bin/../avr/include/util/delay.h:89:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
12
main.c:4:29: error: AmadeusTraceAVR.h: No such file or directory
13
main.c:6: warning: function declaration isn't a prototype
14
main.c: In function 'main':
15
main.c:8: warning: implicit declaration of function 'ATInit'
16
main.c:12: warning: implicit declaration of function 'ATSendString'
17
main.c:14: warning: implicit declaration of function 'ATTraceAllowed'
18
main.c:15: warning: implicit declaration of function '_ATActivate'
19
main.c:16: warning: implicit declaration of function 'ATSendByte'
20
main.c:22: warning: implicit declaration of function '_ATMakeTristate'
21
main.c:7: warning: unused variable 'i'
22
MAKE.EXE: *** [main.o] Error 1

Ich probiere die Source soweit abzuändern, dass ich das eigentliche 
Problem unter die Lupe nehmen kann. Kann aber etwas dauern...

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

So hier die geänderte Source, die ohne Probleme kompiliert wird und im 
Anhang das zugehörige Makefile (beim TARGETnamen, DEBUGformat, MCU und 
F_CPU ggf. anzupassen)

main.c
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <math.h>
4
5
#if 0
6
#include "AmadeusTraceAVR.h"
7
#else
8
// Dummyfunktionen
9
#define ATInit()
10
#define ATSendString(X)
11
#define ATTraceAllowed()  1
12
#define _ATActivate()
13
#define _ATMakeTristate()
14
#define ATSendByte(X)
15
#endif
16
17
int main() {
18
  volatile  unsigned long i= F_CPU;
19
  ATInit();
20
  float a = 3.1415926;
21
  a = sin (a);
22
23
  ATSendString("Als nächstes kommt die Ausgabe eines Float");
24
25
    if (ATTraceAllowed()){
26
      _ATActivate();
27
        ATSendByte(0x5);
28
        ATSendByte(0x0e);
29
        ATSendByte(*((unsigned char*)&a+3));
30
        ATSendByte(*((unsigned char*)&a+2));
31
        ATSendByte(*((unsigned char*)&a+1));
32
        ATSendByte(*((unsigned char*)&a+0));
33
      _ATMakeTristate();
34
    }
35
36
   return 0;
37
}

Achte im angehängten Makefile mal auf die Zeile 233
MATH_LIB = -lm

von Bernd (Gast)


Lesenswert?

Danke,

werde ich mal ausprobieren, aber warscheinlich nicht vor Donnerstag.

Grüße,
Bernd

von Be M. (bemi)


Angehängte Dateien:

Lesenswert?

Vorlesung ist ausgefallen, da habe ich doch noch ein bischen Zeit :-)

Irgendwie mache ich mit Deinem makefile etwas falsch. Ich bekomme da 
immer:
make: *** No rule to make target `main.elf', needed by `elf'.  Stop.
Build failed with 1 errors and 0 warnings...

Ich muss zugeben, dass ich mich mit makefiles nicht wirklich auskenne. 
Vielleicht hänge ich einfach mal das ganze Projekt dran. Wenn Du da 
vielleicht noch einmal gucken könntest.

Danke

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ah, du arbeitest aus AVR Studio heraus. Ich nicht ;-)

Bei mir steht obiger Quelltext als Datei main.c im gleichen Verzeichnis 
wie das Makefile. Und ich mache das ELF-Programm dann durch die Eingabe 
von make auf der Kommandozeile.

Das Makefile in deinem AVR Studio Projekt enthält die Mathelibrary 
nicht und damit ist die Fehlerursache klar.

Schau in den Projekteinstellungen vom AVR Studio nach und ändere die 
Einstellungen so, dass die Mathelibrary hinzugebunden wird.

Siehe den Screenshot oben (ist aus der folgenden Anleitung)
http://robopoly.epfl.ch/webdav/site/robopoly/users/171145/public/guide_prog%20v1.0.0.pdf

von Johannes M. (johnny-m)


Lesenswert?

Stefan "stefb" B. wrote:
> Schau in den Projekteinstellungen vom AVR Studio nach und ändere die
> Einstellungen so, dass die Mathelibrary hinzugebunden wird.
...oder stelle in AVRStudio unter Configuration Options "Use external 
Makefile" und gib den Pfad des Makefiles an.

von Be M. (bemi)


Lesenswert?

Es funktionniert.

Da muss man erst einmal drauf kommen, dass "multiple definition of 
`__fixsfsi'" das Fehlen der Library bedeutet.

Perfekt, ich denke, dass sind so die Anfängerfehler, die man so macht.

Danke und Grüße,
Bernd

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bernd M. wrote:

> Da muss man erst einmal drauf kommen, dass "multiple definition of
> `__fixsfsi'" das Fehlen der Library bedeutet.

Das ist ja auch ein Bug und kein Feature. ;-)  Leider einer, der aus
logistischen Gründen nicht so einfach zu reparieren ist.

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.