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
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?
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;
}
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...
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
intmain(){
18
volatileunsignedlongi=F_CPU;
19
ATInit();
20
floata=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(*((unsignedchar*)&a+3));
30
ATSendByte(*((unsignedchar*)&a+2));
31
ATSendByte(*((unsignedchar*)&a+1));
32
ATSendByte(*((unsignedchar*)&a+0));
33
_ATMakeTristate();
34
}
35
36
return0;
37
}
Achte im angehängten Makefile mal auf die Zeile 233
MATH_LIB = -lm
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
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
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.
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
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.