Forum: Compiler & IDEs Implizite Deklaration der Funktion »itoa«. Ich finde den Fehler nicht.


von Programmieranfängeranwärter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich finde den Fehler nicht. Ich versuche, ein kleines C-Programm zu 
kompilieren. Es soll den ADC auslesen und den Wert auf einem LCD 
ausgeben. Beim kompilieren (ich benutze Code::Blocks) erscheint folgende 
Fehlermeldung:

###Anfang Fehlermeldung###
-------------- Build: Debug in lcdtest1 ---------------

Compiling: main.c
main.c: In Funktion »main«:
main.c:27: Warnung: Implizite Deklaration der Funktion »itoa«
Linking console executable: bin/Debug/lcdtest1.elf
/usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible 
/usr/lib/libm.so when searching for -lm
/usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible 
/usr/lib/libm.a when searching for -lm
/usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible 
/usr/lib/libc.so when searching for -lc
/usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible 
/usr/lib/libc.a when searching for -lc
Output size is 12,96 KB
Running project post-build steps
avr-objcopy -O ihex -R .eeprom -R .eesafe bin/Debug/lcdtest1.elf 
bin/Debug/lcdtest1.elf.hex
avr-objcopy --no-change-warnings -j .eeprom --change-section-lma 
.eeprom=0 -O ihex bin/Debug/lcdtest1.elf bin/Debug/lcdtest1.elf.eep.hex
Process terminated with status 0 (0 minutes, 0 seconds)
1 errors, 0 warnings
###Ende Fehlermeldung###

Ich bin überzeugt, alle relevanten Dateien korrekt eingebunden zu haben. 
Was mich ebenfalls wundert, ist die immense Größe der erzeugten 
HEX-Datei von über 5 kB.

von J.-u. G. (juwe)


Lesenswert?

"itoa" möchte als ersten Parameter einen Integer haben. Du hast 
"ergebnis" als "double" deklariert.

Warum eigentlich? Die einige Zuweisung die ich finden konnte:
1
ergebnis = read_ADC(0);
liefert doch einen unsigned int.

von Alexander F. (alexf91)


Lesenswert?

Lässt sich bei mir einwandfrei kompilieren.

Dein Problem ist auch nicht die itoa Warnung, sondern der Linker.
Scheinbar versucht der, gegen die x86 Libraries zu linken.
Ausführbarer Code gehört außerdem nicht in Header, sondern in Source 
Files.

Welches Betriebssystem verwendest du?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die Suchpfade für Header-Files und Libraries zeigen fälschlicherweise
auf die Verzeichnisse /usr/include und /usr/lib, die für PC-Programme da
sind. Die erste Meldung wird ausgegeben, weil es im stdlib.h unter Linux
kein itoa gibt. Der Linker meckert, weil die Libraries im Objektformat
für x86 o.ä. statt für AVR sind.

Wenn der AVR-GCC und die AVR-Libc richtig installiert sind, sollte das
Programm ohne Warnungen bauen, es sei denn, du gibst die Pfade explizit
(mit -I und -L) falsch an.

: Bearbeitet durch Moderator
von Programmieranfängeranwärter (Gast)


Lesenswert?

J.-u. G. schrieb:
> "itoa" möchte als ersten Parameter einen Integer haben. Du hast
> "ergebnis" als "double" deklariert.

Ok. Habe ich korrigiert, hat allerdings keine Besserung gebracht.

Alexander F. schrieb:
> Ausführbarer Code gehört außerdem nicht in Header, sondern in Source
> Files.

Ich weiß. Müsste sich aber doch zum Testen trotzdem kompilieren lassen.

Alexander F. schrieb:
> Welches Betriebssystem verwendest du?

Momentan Ubuntu 10.04LTS

Yalu X. schrieb:
> Die Suchpfade für Header-Files und Libraries zeigen fälschlicherweise
> auf die Verzeichnisse /usr/include und /usr/lib, die für PC-Programme da
> sind. Die erste Meldung wird ausgegeben, weil es im stdlib.h unter Linux
> kein itoa gibt. Der Linker meckert, weil die Libraries im Objektformat
> für x86 o.ä. statt für AVR sind.

Danke! Das was es! Habe die Pfade auf das AVR-Verzeichnis gesetzt. Jetzt 
verschwindet auch die Fehlermeldung zur impliziten Deklaration. Wie 
kommt man denn auf so etwas? Ist es das, was man als Erfahrung 
bezeichnet oder habe ich irgendwo gepennt?

von Programmieranfängeranwärter (Gast)


Lesenswert?

Gibt es sonst noch irgendwelche Code::Blocks-spezifischen Geheimnisse, 
die man unbedingt kennen muss?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Programmieranfängeranwärter schrieb:
> Habe die Pfade auf das AVR-Verzeichnis gesetzt. Jetzt verschwindet
> auch die Fehlermeldung zur impliziten Deklaration. Wie kommt man denn
> auf so etwas? Ist es das, was man als Erfahrung bezeichnet oder habe
> ich irgendwo gepennt?

Normalerweise solltest du für die Standardbibliothek und die zugehörigen
Header-Files überhaupt keine expliziten Pfade setzen müssen, da diese
schon im Compiler und Linker als Default einprogrammiert sind.

von Ausgeloggt (Gast)


Lesenswert?

Programmieranfängeranwärter schrieb:
> Wie kommt man denn auf so etwas?

Steht doch in der Ausgabe von Linker:
1
/usr/lib/gcc/avr/4.3.4/../../../avr/bin/ld: skipping incompatible 
2
/usr/lib/libm.so when searching for -lm

/usr/lib/ isst nicht der richtige Ort für AVR-Libraries...

> Ist es das, was man als Erfahrung bezeichnet oder habe ich irgendwo gepennt?

Ja ;-)

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.