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;
}
Das Beispiel ist nicht ausreichend, um den Fehler nachzuvollziehen
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
Achte im angehängten Makefile mal auf die Zeile 233 MATH_LIB = -lm
Gast
#729904
Danke, werde ich mal ausprobieren, aber warscheinlich nicht vor Donnerstag. Grüße, Bernd
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
